Asp.net 发布分为:动态编译和预编译。预编译又分为:In Place Pre-compilation 和 Pre-compilation for Deployment。关于asp.net编译,推荐Artech写的:
深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
深入剖析ASP.NET的编译原理之二:预编译(Precompilation)
本文讲述的编译都是预编译中Pre-compilation for Deployment的Updatable Pre-compilation。如图所示:
来到新公司的这段时间,经常听到同事们抱怨:只是改了几个页面,每次都要将整个网站发布一遍,然后从上百个文件中仔细的挑选自己改的那几个页面。
仔细想想,以前开发的网站都是客户定制的,网站一交付,基本就不会再修修改改了,或者根本就不发布网站,直接把源码放到IIS中,故不会频繁发布网站。
来到新公司之后,开发的是公司自己的在线产品,经常需要对网站升级、修改,因而需频繁的发布网站。
对需要频繁发布网站的团队来说,vs自带的发布网站工具,带来的痛苦有:
a、每次需整个发布一遍,特别耗时间。页面越多,预编译就越慢。
b、需要仔细挑出自己修改过的aspx页面和bin下对应的dll文件。同样是:页面越多,越不容易找到,特别是dll。
听说博客园博客程序中.aspx和.ascx文件总共加起来有3000多个,使用fixednames编译需要30分钟,呵呵~~
那怎么办呢?
以下提供两种解决方法:
将所有的aspx.cs文件集中放到同一类库项目下,意味着你揽了ASP.NET预编译的活。也就是说预编译给每个页面生成的代码,你需要自己手写。
先来对比一下正常发布,页面文件内容的变化:
Web.config设置:
Default.aspx:
发布前:
发布后:
Default.aspx.cs:
发布前:
发布后(用.Net Reflector打开bin目录下对应的dll):
由此可见,预编译做的工作:
Demo:
总结
优点:
缺点:
当我修改了a.aspx.cs,b.aspx.cs也被别人修改时或者还没有被签入,我没有获取最新版本,然后就把类库编译成的dll,更新到服务器上从
而会出现问题,更偏好Asp.net预编译生成的一个页面对应一个dll的方式,只发布自己改的文件,将影响面积降到最低。
个人觉得这个缺点的理由不够充分,既然要发布,那就必须保证你编译的所有代码版本不应该比服务器上的版本低,
如果这个保证不了,那怎么能保证页面引用的其他dll是最新的呢,而且如果照上述逻辑,
asp.net mvc岂不是也有这种情况?给每个cs都单独生成一个dll岂不更好?
故而认为,不管哪种方式都有覆盖他人代码的风险,只是这种方式风险稍微大些。
aspx.cs文件放到单独的类库项目 其实是一种变通的方法,本质上并没有解决vs自带的发布网站工具每次都要预编译整个网站的缺陷。那只能自己开发个插件了。
其中涉及到几个技术点:
例如:
aspnet_compiler -p c:\website -c -v c:\PrecomplierWeb -fixednames –u
参数说明:
LimusicAddin 使用说明: