在 Java 项目里多用 Ant 来自动构建项目,随着惯性思维,很容易就找到了 .Net 里也有类似的构建工具 NAnt。最该死的是连 Maven 在 .net 中的对应产物 NMaven 也都有了,http://sourceforge.net/projects/nmaven/。从 Ant 到 NAnt 自然会有一种驾轻就熟的感觉。其实 MS 也为我们提供了相应的构建工具,如早先的 nmake 和现在的 MSBuild,它们各自用特定的构建文件,只是纯粹的项目构建工具。
NAnt 能让你完成许多的系统操作,并且是扩展的,它能独立的完成诸如取版本、编译、打包、发布、Email 通知等一系列过程。如果再让 NAnt 结合 MSBuild 便能制作出完全自动化,一劳永逸,简单化的构建方案。比如这里的例子讲述了如何用 NAnt 构建一个 WebSite 项目,并把生成的多个动态库,像:App_Web_j_5i4fnt.dll、App_Code.dll、App_global.asax.dll 用 aspnet_merge.exe 命令合成为一个固定名字的动态库,如 Unmi.Web.dll。这样非常有利于站点的部分更新。
关于把动态库合并为一个固定名字的文件,本人在 VS2008 发布网站时如何产生固定命名的 Dll 文件 是用另一种方法实现的,需要下载安装 WebDeploymentSetup.msi,比起 NAnt 的办法个人觉得略显麻烦,而且不够灵活。
本例环境:VS2008 下的 WebSite 项目,安装 VS2008 时注意选项,因为要用到它提供的 aspnet_merge.exe 命令,通过 Windows SDK 更新也能获得它。
NAnt 可从 http://nant.sourceforge.net 下载,解压后设定 PATH 环境变量指向到它的 bin 目录。
具体步骤如下:
1. 在 NAnt 的 bin/ 目录下新建一个 NAnt.bat,内容为:
@echo off
nant -buildfile:%1
pause
这样方便于在 Visual Studio 中双击执行自动构建,能直接用构建文件作为执行参数。并且在构建完成后不立即关闭命令窗口,可让您看到构建的结果,成功或失败,失败的原因。
2. 更新方案文件中的目标目录,例如我们要生成的目录文件在 d:\target,那么打开方案文件,假定是 C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\WebSite1\WebSite1.sln,把以下两行:
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\FNPro\"
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\FNPro\"
更改为:
Debug.AspNetCompiler.TargetPath = "d:\target"
Release.AspNetCompiler.TargetPath = "d:\target"
其实也可不去改方案文件的目标目录,只需在 MSBuild 命令中用属性参数来覆盖掉方案的配置,例如下面的 <exec program="${msbuild.exe}" commandline='${Solution} /p:Configuration=${Configuration}' />
加个 OutDir 配置来指定构建的输出目录
<exec program="${msbuild.exe}" commandline='${Solution} /p:Configuration=${Configuration};OutDir=${build.dir}\' />
构建后你会发现,生成要发布的文件并非在 d:\target 目录中,而是 d:\target\_PublishedWebsites 目录中。目前暂没找到办法控制文件生成在 d:\target,所以后续的操作也要改动到 d:\target\_PublishedWebsites 目录中去。
3. 建立构建文件,如我们在项目目录下建立 Project.build,内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?xml version="1.0" encoding="utf-8"?> <project name="Unmi.Web" default="complete_build" description="Automatic build using NAnt"> <property name="Configuration" value="Release"/> <!-- Release Or Debug--> <property name="assembly.version" value="1.0.0.9"/> <property name="assembly.title" value="unmi.blogjava.net"/> <property name="dll.filename" value="Unmi.Web.dll"/> <property name="Solution" value='"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\WebSite1\WebSite1.sln"'/> <property name="build.dir" value="d:\target"/> <property name="sdk35.dir" value="C:\WINDOWS\Microsoft.NET\Framework\v3.5"/> <property name="sdk20.dir" value="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"/> <property name="msbuild.exe" value="${sdk35.dir}/msbuild.exe"/> <property name="aspnet_compiler.exe" value="${sdk20.dir}\aspnet_compiler.exe"/> <property name="asp_merge.exe" value="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\aspnet_merge.exe"/> <target name="complete_build" description="Start build ......" depends="init,compile,assembly_info,compile,post-merge" /> <target name="init" description="Clear the output directory"> <delete dir="${build.dir}"/> <mkdir dir="${build.dir}"/> </target> <target name="compile" description="Use MSbuild.exe to compile ASP.Net Project"> <exec program="${msbuild.exe}" commandline='${Solution} /p:Configuration=${Configuration}' /> </target> <target name="assembly_info" description="Generate a AssemblyInfo.cs with version and compile it"> <asminfo output="${build.dir}\AssemblyInfo.cs" language="CSharp"> <imports> <import namespace="System" /> <import namespace="System.Reflection" /> </imports> <attributes> <attribute type="AssemblyVersionAttribute" value="${assembly.version}" /> <attribute type="AssemblyTitleAttribute" value="${assembly.title}" /> </attributes> </asminfo> <csc target="library" output="${build.dir}\AssemblyInfo.dll" debug="false"> <sources> <include name="${build.dir}\AssemblyInfo.cs"/> </sources> </csc> </target> <target name="merge" description="Merge the multiple web dll into one file"> <exec program="${asp_merge.exe}" commandline="${build.dir} -a -r -copyattrs ${build.dir}\AssemblyInfo.dll -o ${dll.filename}"/> </target> <target name="post-merge" description="Delete some unused files"> <delete file="${build.dir}\Project.build"/> <delete file="${build.dir}\AssemblyInfo.cs"/> <delete file="${build.dir}\AssemblyInfo.dll"/> <!-- Open the target directory --> <exec program="explorer" commandline="${build.dir}" failonerror="false"/> </target> <target name="precompile-web" description="Precompile page files if necessary"> <exec program="${aspnet_compiler.exe}" commandline='-v ${Solution} "${build.dir}"' /> </target> </project> |
这是一个 xml 文件,可以在 Visual Studio 中用 XML Editor 来编辑它。几点说明:
1. 其中指定最终生成的动态库的文件名,以及动态库的版本信息。用临时的 AssemblyInfo.cs 及编译的 AssemblyInfo.dll 来设置版本信息的。
2. 构建目录要与前面方案文件中的 Debug.AspNetCompiler.PhysicalPath/Release.AspNetCompiler.PhysicalPath 一样,都是 d:\target
3. 最后构建完成后,为发布方便会自动用资源管理器打开构建目录的窗口。
你可以更深入的探究 NAnt 来自动完成单元测试、发布、或打包,进行 IIS 的操作,发邮件给相关人等操作。
4. 执行构建
两种方法
1) 可以直接在控制台下执行 nant 命令,cd 到 Project.build 目录,执行 nant -buildfile:Project.build,或者 nant.bat Project.build。
2) 在 Visual Stuio 中,右键点击 Project.build,打开 Open With 窗口,Add..,选上 NAnt.bat,并 Set As Default。这样以后每次构建只要双击那个 Project.build 即可完成。
对于 NAnt 结合 MSBuild 的使用还可以进一步发掘,在 NAnt 的 bin\extensions\common\2.0\ 目录中有个 NAnt.MSBuild.dll 文件,应该可以此来简化上面的构建文件。
参考:1. ASP.NET 合并工具 (Aspnet_merge.exe)
2. Managing ASP.NET Precompiled Output for Deployment Using the aspnet_merge.exe Command
3. NAnt与MSBuild使用(一)
4. NAnt Task Reference
本文链接 https://yanbin.blog/nant-asp-net-fixed-dll-name/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。