对VS.NET工程进行自动构建工作使用什么?也许大家会异口同声的说是NANT。嗯,NANT无疑是自动构建VS.NET工程最快捷的工具,但对于一个拥有多个编程语言环境的项目,使用专用版的ANT工具却并不是一个好的解决方案,试想,如果你的项目拥有多个由不同语言开发的模块,那么你可能会同时使用ANT、WANT、NANT来分别管理特定的模块。
当然,这不是我们想看到的,同时维护三个构建工具实在不是什么明智之举(当然,如果你喜欢,那就无可厚非了),其实ANT已经为我们通吃所有语言环境准备好了精兵良驹。
ANT的exec标签是用来执行一个系统命令,这样我们就可以使用开发工具的命令行编译方法来完成相应项目的自动构建工作。下面我们只介绍VS.NET工程的命令行编译方法:
VS.NET开发工具的命令行编译命令是devenv,当然前提是将VS.NET的IDE目录路径放置到PATH变量中。设置好PATH变量,在控制台中键入devenv /?,我们可以看到VS.NET的各个参数说明,如下:
Microsoft (R)
开发环境 7.10.3077 版。 版权所有
(C) Microsoft Corp 1984-2001 。保留所有权利。 用法
: devenv [solutionfile | projectfile | anyfile.ext] [switches]
可以调用
devenv ,用第一个参数指定解决方案文件或项目文件。 也可以调用
devenv ,使第一个参数作为要在编辑器中打开的任何 其他类型的文件。如果提供项目文件,
IDE 将通过在与项目文件 相同的目录中查找与项目文件具有相同基名称的
.sln 文件,在 解决方案的上下文中打开该项目文件。如果存在
.sln 文件,则 IDE
将查找引用该项目的单个 .sln 文件。如果不存在这样的单 个
.sln 文件,则 IDE 将创建一个具有默认 .sln 文件名的未保 存的解决方案,而该默认文件名与项目文件具有相同的基名称。
命令行生成
: devenv solutionfile.sln /build solutionconfig [ /project projectnameorfile [ /p
rojectconfig name ] ]
可用的命令行开关
: /build
生成指定的解决方案配置 /project
指定生成项目而不是解决方案 必须指定 /build 才能使用 /project /projectconfig
指定要生成的项目配置 必须指定 /project 才能使用 /projectconfig /out
将生成结果写入指定的文件 /rebuild
与 /build 类似,但先执行强制清理 /clean
清理生成结果 /deploy
生成指定的解决方案配置然后部署它 /run
运行指定的解决方案配置 /runexit
运行指定的解决方案配置然后终止 /command
启动后执行指定的内部命令行 /mditabs
使用选项卡式文档界面 /mdi
使用 MDI 界面 /fn
使用指定的字体名称 /fs
使用指定的字体大小 /LCID
使用指定的语言 ID /noVSIP
禁用用于 VSIP 测试的 VSIP 开发人员许可证密钥 /safemode
出于稳定性仅加载默认的环境和服务 /resetskippkgs
允许曾被标记为加载失败的 VsPackages 再次加载 /migratesettings
迁移另一个版本中的某些用户设置 产品特定的开关
: /debugexe
打开要调试的指定可执行文件。 命令行的其余部分作为它的参数 传递到此执行文件。 /useenv
使用 PATH 、 INCLUDE 、 LIBPATH 和 LIB 环境变量 而不是使用 VC++ 生成的 IDE 路径。 若要从命令行附加调试器,请使用
: vs7jit.exe -p <pid>
|
可见VS.NET工具为我们提供了诸多支持命令行编译的参数,那接下来我们就开始动手配置Build.xml文件吧,为了节省篇幅,我这里只给出compile任务的代码:
1 <target name="compile" depends="init">
2 <mkdir dir="${pdcu}"/>
3 <echo message="Compiling application main source…"/>
4 <delete file="${infofile}"/>
5 <exec dir="${pdir}/" executable="devenv" os="${build.os}" >
6 <arg line=" ${pname}.sln
7 /rebuild
8 release
9 /useenv
10 /out ${infofile}
11 "/>
12 </exec>
13 <echo message="Compiling application main source complete."/>
14 <loadfile property="compiled-info"
15 srcFile="${infofile}"/>
16 <echo message="${compiled-info}"/>
17 <condition property="compile-success">
18 <and>
19 <contains string="${compiled-info}" substring="0
已失败 "/> 20 </and>
21 </condition>
22 <fail unless="compile-success"
23 message="${compiled-info}"/>
24 </target>
|
我们来详细分析一下上面的代码。
第1行是任务定义,在此不过多解释。
2-4行是任务定义和准备工作,主要是建立编译生成目录和清理旧的输出文件。
5-12行便是命令行编译的主要代码,我们来逐个解释。
第5行定义了一个exec标签,用来调用devenv命令,并指定了编译所在当前目录dir属性,和操作系统信息os属性。
从第6行开始则为devenv命令的参数部分。
其中第6行指定了要编译的解决方案。
第7行标明该解决方案要进行重新编译。
第8行指定了编译类型为release模式。
第9行指定编译器使用 PATH、INCLUDE、LIBPATH 和 LIB 环境变量。
第10行指定了编译信息输出的文件位置。由于devenv命令执行完毕后,ANT无法从命令行获取编译信息,所以不能使用exec的output属性来指定输出位置(在调用Delphi编译器的时候,ANT可以正常获取编译信息,因此output属性有效),只能使用编译器所具有的参数功能将信息输出,该信息为判断编译成功与否的关键。
14-15行读取了上述的编译信息文件的内容,以便之后判断编译是否成功。
17-21行则定义了一个编译结果,用于判断编译是否成功。结果使用了contains属性来判断,如果输出文件中包含字符串“0 已失败”,则说明编译成功完成。
22-23行则是指示了ANT,一旦编译失败,则打印出编译信息。
当然,这里只介绍了编译VS.NET工程的其中一种方法,在此抛砖引玉。既然ANT为我们提供了如此强大的系统命令执行功能,那么我们便可以在各种编程语言环境中游刃有余了。