MSBuild和NANT2006-11-14 15:51昨天,把微软的MSBuild研究了一下。其实.Net平台上的Make工具,已经有了NAnt。但是MSBuild作为官方发布的工具,VS2005对于它有很好的环境支持。
这些Ant类的工具,具有一下特点:
构建程序
可以自动根据文件时间,来进行递增构建。
可以扩充,以完成比较负责的任务。
一般是通过XML来描述构建过程。
一般包含Property 、Target以及Target之间的依赖关系,以构成一个构建序列。
可以指定运行的Target,干不同的事情。
功能强大,并不是只有用来构建程序,还可以比较夸张的说可以干任何需要重复执行的自动化工作。
我的目录下一般分src和debug两个目录,src顾名思义包含源文件,debug包含输出的文件。
以前的Nant文件的内容是:
<project name="g" default="compile" basedir=".">
<property name="build.dir" value="debug"/>
<property name="src.dir" value="src"/>
<property name="target" value="g.exe"/>
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${src.dir}"/>
</target>
<target name="compile" depends="init">
<csc target="exe" output="${build.dir}\${target}">
<sources>
<include name="${src.dir}\**\*.cs" />
</sources>
</csc>
</target>
<target name="run" depends="compile">
<exec program="${build.dir}\${target}" />
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
而新建的MSBuild文件内容为:
<Project DefaultTargets = "Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<PropertyGroup>
<BuildDir>debug</BuildDir>
<SourceDir>src</SourceDir>
<TargetExe>g</TargetExe>
</PropertyGroup>
<Target Name="MakeBuildDir">
<MakeDir Directories = "$(BuildDir)"
Condition = "!Exists('$(BuildDir)')" />
</Target>
<ItemGroup>
<CSFile Include="$(SourceDir)\*.cs" />
</ItemGroup>
<Target Name="Compile" Inputs="@(CSFile)" Outputs="\$(BuildDir)\$(TargetExe).exe" DependsOnTargets="MakeBuildDir">
<CSC
Sources="@(CSFile)"
OutputAssembly = "$(BuildDir)\$(TargetExe).exe">
<Output TaskParameter = "OutputAssembly"
ItemName = "EXEFile" />
</CSC>
</Target>
<Target Name="Run" DependsOnTargets="Compile">
<Exec Command="$(BuildDir)\$(TargetExe).exe"/>
</Target>
<Target Name="Clean">
<Delete Files="\$(BuildDir)\$(TargetExe).exe" Condition="Exists('$(BuildDir)\$(TargetExe).exe')"/>
</Target>
</Project>
可以看到,MSBuild引入的是ItemGroup和PropertyGroup两个概念,不同于NAnt的用${属性}引用,他的里面:
$(Property名)来表示引用PropertyGroup里面的内容
@(Item名)来引用ItemGroup里面的内容
ItemGroup和PropertyGroup不同之处在于是否可以元素是否可以出现多次,ItemGroup可以,Property则不可以。
其他的不同之处在于递增构建的支持,在MSBuild里面必须明确指出。如上面的CSC里面必须指定Inputs和Outputs,否则MSBuild不是递增构建。而NAant则默认都是递增构建,即只编译比较新的源文件。
其他的都支持条件格式。NAant还支持内部的C#语句,发现就会自动编译。
MSBuild还支持一些其他的Task,都是.Net平台上面的东西,如Mainfest、SNK等,对于.Net的编译显的比较专业。
自动构建确实是一个好东西。他让你远离IDE,没有了代码自动提示,没有了花哨的界面,只有代码。感觉真是不同。