blog » C#/NET » MSBuild和NANT

MSBuild和NANT

昨天,把微软的MSBuild研究了一下。其实.Net平台上的Make工具,已经有了NAnt。但是MSBuild作为官方发布的工具,VS2005对于它有很好的环境支持。

这些Ant类的工具,具有一下特点:

  1. 构建程序
  2. 可以自动根据文件时间,来进行递增构建。
  3. 可以扩充,以完成比较负责的任务。
  4. 一般是通过XML来描述构建过程。
  5. 一般包含Property 、Target以及Target之间的依赖关系,以构成一个构建序列。
  6. 可以指定运行的Target,干不同的事情。
  7. 功能强大,并不是只有用来构建程序,还可以比较夸张的说可以干任何需要重复执行的自动化工作。

我的目录下一般分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,没有了代码自动提示,没有了花哨的界面,只有代码。感觉真是不同。

来源:http://blog.163.com/gm8pleasure@126/blog/static/25798077200610143511381/

This post has already been read 1708 times!

Related posts

RSS 2.0 | leave a response | trackback

发表评论