asp.net添加生成步骤

2017年9月18日

用过Gradle或Grunt的用户知道,构建项目时可以添加构建步骤;编译代码只是其中一步。比如,一次构建可包括以下几个步骤:编译代码、运行测试、压缩、上传服务器。

asp.net窗体网站能不能添加这样的构建步骤呢?

asp.net窗体网站,尤其在采用动态编译的部署方式时,对自定义构建的支持比较有限。

web.config的<buildProviders>配置节可以添加生成提供程序。(微软使用生成这个词,Java社区常用构建这个词)生成提供程序用于将非.cs、.vb扩展名的文件转换为C#或VB代码。这样的文件被称为非代码文件。在自定义生成提供程序时,最重要的工作就是实现BuildProvider.GenerateCode(AssemblyBuilder)。在这个方法里,用VirtualPath属性获取正在生成的非代码文件。

BuildProviderAppliesTo特性可应用于BuildProvider,指定对哪些文件夹里的扩展名匹配的非代码文件运行此生成提供程序。如果为Code,则仅对App_Code文件夹里的扩展名匹配的非代码文件运行;如果为Resouces,则对App_GlobalResources和App_LocalResources的文件运行;如果为Web,仅对其他目录的文件运行。默认为All,对所有文件运行。

但是,BuildProviderAppliesTo特性仅在网站预编译时被使用。如果你的asp.net窗体网站采用动态编译的方式部署,生成提供程序永远不会对非App_Code(未验证App_GlobalResources和App_LocalResources)以外的文件运行。

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述指出,在动态编译时,asp.net首先编译顶级项,即App_Code,App_GlobalResources、web.config等项目,最后编译aspx、ascx等网页文件。如果aspx引用代码隐藏文件或其他.cs文件,那些代码文件才会被动态编译。

所以,如果要像Grunt一样在动态编译的asp.net窗体网站里添加一个步骤,最小化JavaScript文件,则基本是不可行的。因为JavaScript文件不在App_Code文件夹,没有被页面文件引用,所以根本不会编译js文件,不会调用生成提供程序。

也不方便用<codeSubDirectories>添加JavaScript目录,因为添加的目录只能是App_Code的子目录,不能用../语法跳到上级。此外,修改App_Code里的任何文件都会导致网站重编译。