RIA造成XAP无修改重打包问题的解决办法
RIA提供了将Web工程上的域服务自动转到silverLight工程上的客户端的机制,也就是.net代码转为sl代码的过程。
正常情况下,如果一个工程没有修改,编译时会保持上一个版本,其输出文件的修改时间不会变动。但在开发中,发现开启了RIA链接的SL工程每次都在重新生成输出文件,尽管源Web工程和SL工程都没有任何人为的修改。
下面,先建一个例子说明问题:
选择业务模板:
生成两个工程:
右键点客户端工程,选择生成:
首次编译结果:
什么都不改,再次选择生成,结果:
就和图片上一样的,第2次编译和第1次没什么不同,又重新打了一次包。
如果现在还不明白这个问题,可以随便新建一个类库工程或其它,看是否会出现这种情况。
现在的问题是不论是否更改了代码,都会重新编译,重新打包。这会造成什么问题?
在程序方面,首先如果设置版本自动,每次编译都会修改版本号。且输出文件每次都会变更时间。其实这里主要是指开启了设置RIA链接的SL库工程,会导致依赖于其的所有SL库或应用工程重编,工程大时会浪费很多编译时间。
重要的影响在用户,每次浏览都会被强制重新下载XAP。如果程序使用SL缓存,至少需下载一个XAP包,如果没有使用SL缓存,那么包含整个工程的XAP就要被重新下载。IE浏览器总会检测到XAP等包是新的,造成浏览器层的缓存机制无效。
直接来看解决这个问题的结果,也就是正常情况应该出现结果:
现在可以看到,XAP没有重新打包,这是正常的,因为没有代码修改。
出现问题的原因,可以用一句话来描述,RIA框架每次转换域服务时,不管代码是否修改,都会在SL工程重新生成客户端的代码。
下面是解决办法,在sl工程和生成前事件,调用一个程序,不让VS重新编译。
此方法用于开启了RIA链接的SL应用程序工程和SL库工程。
格式:x:\xxxxxxx\RiaCodeKeep $(ProjectDir) 前面是执行程序+空格+工程目录宏(如有空格目录需加双引号。因有时把bin放到外面,所以需要指定这个工程目录)
因为修改生成事件,也算一次修改,所以效果下次的下次编译才可以看以看到。
每次编译时,会在启动一个最小化的窗口,在任务栏点开,显示一些工作状态,这个窗口会自动关闭,可以不看,点开这是样的。
窗口内信息其实显示了工作原理,相信只要能遇到这个问题的都能理解,不赘述了。
最后特意说明,这个插件毕竟不是官方的,并不能百分百的防止无修改重编译。期待RIA的下个补丁会修正这个问题。