在.Net framework中,一个不太被大家熟知的工具就是MSBuild。这个命令行工具通过执行XML脚本可以自动生成软件工程文件。
但问题来了,“我为什么想要我的生成过程自动化?”。 其实,大部分普通的的项目都有可能包含一系列的生成过程,例如:
- · 增加版本号
- · 编译源代码
- · 针对不同的部署环境选择正确的设置(例如,测试或者现场)
- · 在安装包中引入第三方的依赖
像这些工作,如果手动生成我们想要的一定是一个会非常耗时,容易出错的过程。并且我们一开始在创建脚本时花的时间完全可以被后来的自动化过程给抵消掉,还有如果我们采用手工的方式的话,我们会经常出错,并且做很做重复的工作。
好了,现在希望在你的心里已经有个理念就是我们可以从自动化生成中获得很多好处,那么我们现在开始我们的第一个脚本,让我们看一下我们的第一个例子,下面是一个ASP .NET MVC web site.
注意看,除了web.config文件, 还存在live.config 和 test.config 文件。现在的想法是:web.config包含所有的关于网站的配置, live.config和test.config仅仅包含那些跟部署环境相关的配置。这样能避免不同文件中的重复配置导致的头痛问题。 但是这样也给我们增加了挑战,那就是当我进行生成操作时,我们需要把部署环境相关的配置合并到web.confg中。
在开始之前,下面的列出了 构成项目生成的几个步骤
- · 清理删除bin目录下的文件
- · 编译工程
- · 复制所有的部署需要的文件到一个新的输出目录
- · 合并配置文件
- · 部署生成的输出文件到正确的环境
每一个工程都拥有它自己的生成过程, 但是为了更好的展示,我们的这个相当简单。
然后,让我们开始今天的教程,第一步就是添加一个新的XML文件到该网站的根目录,添加完后, 我们下一步就是清理删除bin目录, 目的是服务下一个编译过程。我们的脚本会是下面这样
1 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 <Target Name="Clean"> 3 <ItemGroup> 4 <BinFiles Include="bin\*.*" /> 5 </ItemGroup> 6 <Delete Files="@(BinFiles)" /> 7 </Target> 8 </Project>
在这有一些点需要明确的是:
- 引入命名空间是让Visual Studio 能为MSBuild的功能提供智能提示功能。
- MSBuild 脚本主要是由targets组成,每一个targets都包含一个或tasks。 在这个例子中,我们的target是Clean, 任务是Delete.
- ItemGroups用来定义一组items. 在我们的例子中它定义的是存放在bin文件夹下的所有文件。
- 所有的路径名,像 bin\ *.*,都是相对于生成脚本自己的。
好的。既然我们已经创建完了第一个target. 让我们开始执行它。 打开命令行窗口并且把路径切换到包含你的生成脚本的文件下,执行下面的语句
msbuild Build.xml /t:Clean
如果你遇到MSBuild could not be found的错误, 你需要给它指定个全路径名(我的是C:\Program Files (x86)\MSBuild\12.0\Bin), 或者是添加它的路径到Path环境变量中, 我个人比较推荐后面一种方式。
运行完这个命令,bin文件夹下应该是空的。为了让自己看到效果,最好在执行该命令之前确保bin文件夹下是有东西的。
好,让我们继续下一步:编译该工程,为了实现该功能,我们创建了一个Compile的target. 然后用MSBuild task去执行这个编译过程。
<Target Name="Compile" DependsOnTargets="Clean"> <MSBuild Projects="BuildDemoSite.csproj" /> </Target>
同样的,我们执行下面的命令,你就可以从命令提示框中看到执行的过程,然后检查一下自己的项目已经被编译完成。
msbuild Build.xml /t:Compile
好了,直到现在我们已经完成了:
- 了解生成过程包含什么?
- 决定去实现生成自动化。
- 创建了删除bin文件夹和编译工程的targets.
MSbuild 教程