在 Java 项目里多用 Ant 来自动构建项目,随着惯性思维,很容易就找到了 .Net 里也有类似的构建工具 NAnt。最该死的是连 Maven 在 .net 中的对应产物 NMaven 也都有了,http://sourceforge.net/projects/nmaven/。从 Ant
在 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。这样非常有利于站点的部分更新。
关于把动态库合并为一个固定名字的文件,需要下载安装 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,内容为:
view source
print?
01.<?xml version="1.0" encoding="utf-8"?>
02.<project name="Unmi.Web" default="complete_build" description="Automatic build using NAnt">
03.
04. <property name="Configuration" value="Release"/> <!-- Release Or Debug-->
05. <property name="assembly.version" value="1.0.0.9"/>
06. <property name="assembly.title" value="unmi.blogjava.net"/>
07. <property name="dll.filename" value="Unmi.Web.dll"/>
08.
09. <property name="Solution" value='"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\WebSite1\WebSite1.sln"'/>
10. <property name="build.dir" value="d:\target"/>
11.
12. <property name="sdk35.dir" value="C:\WINDOWS\Microsoft.NET\Framework\v3.5"/>
13. <property name="sdk20.dir" value="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"/>
14.
15. <property name="msbuild.exe" value="${sdk35.dir}/msbuild.exe"/>
16. <property name="aspnet_compiler.exe" value="${sdk20.dir}\aspnet_compiler.exe"/>
17. <property name="asp_merge.exe" value="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\aspnet_merge.exe"/>
18.
19. <target name="complete_build" description="Start build ......" depends="init,compile,assembly_info,compile,post-merge" />
20.
21. <target name="init" description="Clear the output directory">
22. <delete dir="${build.dir}"/>
23. <mkdir dir="${build.dir}"/>
24. </target>
25.
26. <target name="compile" description="Use MSbuild.exe to compile ASP.Net Project">
27. <exec program="${msbuild.exe}"
28. commandline='${Solution} /p:Configuration=${Configuration}' />
29. </target>
30.
31. <target name="assembly_info" description="Generate a AssemblyInfo.cs with version and compile it">
32. <asminfo output="${build.dir}\AssemblyInfo.cs" language="CSharp">
33. <imports>
34. <import namespace="System" />
35. <import namespace="System.Reflection" />
36. </imports>
37. <attributes>
38. <attribute type="AssemblyVersionAttribute" value="${assembly.version}" />
39. <attribute type="AssemblyTitleAttribute" value="${assembly.title}" />
40. </attributes>
41. </asminfo>
42.
43. <csc target="library" output="${build.dir}\AssemblyInfo.dll" debug="false">
44. <sources>
45. <include name="${build.dir}\AssemblyInfo.cs"/>
46. </sources>
47. </csc>
48. </target>
49.
50. <target name="merge" description="Merge the multiple web dll into one file">
51. <exec program="${asp_merge.exe}"
52. commandline="${build.dir} -a -r -copyattrs ${build.dir}\AssemblyInfo.dll -o ${dll.filename}"/>
53. </target>
54.
55. <target name="post-merge" description="Delete some unused files">
56. <delete file="${build.dir}\Project.build"/>
57. <delete file="${build.dir}\AssemblyInfo.cs"/>
58. <delete file="${build.dir}\AssemblyInfo.dll"/>
59.
60. <!-- Open the target directory -->
61. <exec program="explorer" commandline="${build.dir}" failonerror="false"/>
62. </target>
63.
64. <target name="precompile-web" description="Precompile page files if necessary">
65. <exec program="${aspnet_compiler.exe}" commandline='-v ${Solution} "${build.dir}"' />
66. </target>
67.</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 文件,应该可以此来简化上面的构建文件。