只为成功找方向,不为失败找借口

每天都不能停止前进的脚步
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Nant学习总结

Posted on 2008-12-10 13:52  冰碟  阅读(3693)  评论(2编辑  收藏  举报

前言:

     NAnt是一项开源的项目,是一个基于 .NET 的生成工具。利用NAnt,你可以方便快捷地对自己.NET项目或解决方案进行自动构建。

正文:

1, 工具及配置

a)       Nant: 完成代码的自动编译,自动运行测试工具。

下载地址:http://nant.sourceforge.net/builds/

b)       NantContrib:自动从源码库中获取源代码

下载地址:http://nantcontrib.sourceforge.net/nightly/builds/

c)       NUnit2Report:将NUnit测试工具产生的XML报告转换为HTML报告形式

下载地址:http://nunit2report.sourceforge.net/

d)       NUnit:单元测试工具

下载地址:http://nunit.sourceforge.net/

e)       Fxcop代码分析工具

下载地址:http://www.gotdotnet.com/team/fxcop/

     这三个工具(组件)只需要下载zip压缩文件即可,下载完成后,解压就可以用。

     接下来配置nant的环境变量:

     在系统目录下添加一个NAnt.bat文件,编辑此文件内容如下:

     @echo off

"F:\Test\CITest\nant-0.85\bin\NAnt.exe" %*

     这个"F:\Test\CITest\nant-0.85\bin\NAnt.exe"是解压后的NAnt.exe的物理路径,保存OK。

 然后,将nantcontrib-0.85\bin和NUnit2Report.fix.chs.1.0\bin下面的文件拷贝到nant-0.85\bib下面去。这样,我们的工具就可以使用了。

2, 初级应用--Hello World

建立一个default.build文件,XML格式。内容如下:

<?xml version="1.0" encoding="gb2312"?>

<project name="Test" default="run" basedir=".">

 <target name="run">

       <call target="HelloNant"/>

       <call target="HelloWorld"/>

 </target>

 <target name="HelloNant">

       <echo message="Hello Nant"/>

 </target>

 <target name="HelloWorld">

       <echo message="Hello World"/>

 </target>

</project>

保存后,打开“命令提示符”,进入到default.build所在的目录,然后输入nant,回车将会看到下图的界面:

 

下面,我们来看看这个build文件:

1,   project:每个build文件只包含一个project,它含有一系列的target。

a)        name为项目名称

b)        default表示项目默认的target,此示例为run,可选

c)        basedir=“.”表示基准目录为当前目录

2,   target:定义一项任务,target是NAnt脚步具体执行动作的最小单位,包含一系列的task。Name是target的名称,必选。

3,   echo:是一个task,用来显示一个特定的字符串,message表示要显示的字符串。

4,   call: 是一个task,表示调用那个target。

5,   encoding="gb2312"使得脚本文件可以支持中文

OK,我们第一个Demo完成了。

3, 高级应用—日构建

a)       简单build文件

建立文件HelloWorld.cs,编写代码,内容如下:

using System;

namespace HelloWorld

{

    public class HelloWorld

    {

        static void Main()

        {

            Console.WriteLine("Hello World");

        }

    }

}

修改default.build文件,内容如下:

<?xml version="1.0" encoding="gb2312"?>

<project name="Test" default="run" basedir=".">

     <target name="run">

         <!--<call target="HelloNant"/>-->

         <!--<call target="HelloWorld"/>-->

         <call target="implement"/>

     </target>

     <target name="build">

         <mkdir dir="bin"/>

         <csc target="exe" output="bin\HelloWorld.exe">

              <sources>

                   <includes name="HelloWorld.cs"/>

              </sources>        

         </csc>

     </target>

     <target name="implement" depends="build">

         <exec program="bin\helloWorld.exe"/>

     </target>

     <target name="clean">

         <delete dir="bin" failonerror="false"/>

     </target>

     <target name="HelloNant">

         <echo message="Hello Nant"/>

     </target>

     <target name="HelloWorld">

         <echo message="Hello World"/>

     </target>

</project>

         在命令行里运行nant,如下图:

        

    

     编译成功,这时,在F:\Test\NAntTest(我的示例所在的路径)会建立一个bin的文件夹,同时,会产生HelloWorld.exe文件。

下面,我们来看看这个build文件:

1)      mkdir:在当前目录下建立一个名为“bin”的文件夹

2)      csc:和Visual Studio .Net中的csc一样,运行.cs的程序。

Target:我输入的程序类型

Output:输出文件地址和名字

3)      sources:源文件地址

4)      delete:删除目录及里面的所以文件。 我们可以通过nant clean这样的方式去执行clean这个target

5)      failonerror:属性表示即使操作文件夹的过程中出现了错误,也忽略错误向下执行

6)      exec:执行外部程序。

b)       build解决方案

现在假设我们有两个解决方案(Visual Studio 2003的解决方案),目录名为Test1和Test2,放在与default.build相同的根目录里,然后编辑default.build文件,内容如下:

<?xml version="1.0" encoding="gb2312"?>

<project name="Test" default="run" basedir=".">

     <property name="Solution1.Filename" value="F:\Test\NAntTest\test1\test1.sln"/>

     <property name="Solution1.Configuration" value="DEBUG"/>

     <property name="Build1.OutputFolder" value="F:\Test\NAntTest\result\"/>

     <property name="Solution2.Filename" value="F:\Test\NAntTest\test2\test2.sln"/>

     <property name="Solution2.Configuration" value="DEBUG"/>

     <property name="Build2.OutputFolder" value="F:\Test\NAntTest\result\"/>      

     <target name="run">

         <!--<call target="HelloNant"/>-->

         <!--<call target="HelloWorld"/>-->

         <!--<call target="implement"/>-->

         <call target="build1"/>

         <call target="build2"/>

     </target>

     <target name="build1">

         <solution solutionfile="${Solution1.Filename}" outputdir="${Build1.OutputFolder}test"" configuration="${Solution1.Configuration}"/>

     </target>

     <target name="build2">

         <solution solutionfile="${Solution2.Filename}" outputdir="${Build2.OutputFolder}test"" configuration="${Solution2.Configuration}"/>  

     </target>

     <target name="build">

         <mkdir dir="bin"/>

         <csc target="exe" output="bin\HelloWorld.exe">

              <sources>

                   <includes name="HelloWorld.cs"/>

              </sources>        

         </csc>

     </target>

     <target name="implement" depends="build">

         <exec program="bin\helloWorld.exe"/>

     </target>

     <target name="clean">

         <delete dir="bin" failonerror="false"/>

     </target>

     <target name="HelloNant">

         <echo message="Hello Nant"/>

</target>

     <target name="HelloWorld">

         <echo message="Hello World"/>

     </target>

</project>

下面,我们来看看这个build文件:

1)      property:name属性定义了变量的名称,value属性定义变量的值,其中name属性可以使用字母、数字、点号、下划线等符号,而value属性可以使用字符串或是已经定义的变量。Solution1.Filename中的value是解决方案的地址。Solution2.filename同理

Solution1.Configuraton中的value为编译的方式

Build1.OutputFolder为输出的文件地址

2)      solution:编译解决方案。

如果是vs.net 2003的项目的话,应该会成功(我没有装2003 所以不知道),可是我的项目是vs.net 2005编译的时候不成功,如下图:

 

后来才知道Nant不支持Visual Stuido .net 2005。怎么解决呢?“百度一下,你就知道”

MsBuild的使用方法:

在命令行里面输入

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe "F:\Test\NAntTest\Test1\test1.sln" /t:Build /p:Configuration=Debug

效果:

 

说明:

/t:Rebuild|Clearn 生成目标
/p:Configuration=Debug|Release 项目属性
/l:FileLogger,Microsoft.Build.Engine;logfile=Build.log 编译日志
/clp:PerformanceSummary 显示任务、目标和项目花费的时间

但是在NAnt里面怎么用这个呢?还记得吗?有这个task---- exec。我们可以将要编译的解决方案放入一个批处理文件里面,然后用NAnt的exec去调用执行。 

建立一个批处理文件msbuild.bat,文件内容如下:

@echo off

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe "F:\Test\NAntTest\Test1\test1.sln" /t:Build /p:Configuration=Debug

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe "F:\Test\NAntTest\Test2\test2.sln" /t:Build /p:Configuration=Debug

 修改default.build,去掉原有的solution相关的内容,脚步如下:

<?xml version="1.0" encoding="gb2312"?>

<project name="Test" default="run" basedir=".">

     <target name="run">

         <!--<call target="HelloNant"/>-->

         <!--<call target="HelloWorld"/>-->

         <!--<call target="implement"/>-->

         <call target="msbuild"/>

     </target>

     <target name="msbuild">

         <exec program="msbuild.bat"/>

     </target>

     <target name="build">

         <mkdir dir="bin"/>

         <csc target="exe" output="bin\HelloWorld.exe">

              <sources>

                   <includes name="HelloWorld.cs"/>

              </sources>        

         </csc>

     </target>

     <target name="implement" depends="build">

         <exec program="bin\helloWorld.exe"/>

     </target>

     <target name="clean">

         <delete dir="bin" failonerror="false"/>

     </target>

     <target name="HelloNant">

         <echo message="Hello Nant"/>

     </target>

     <target name="HelloWorld">

         <echo message="Hello World"/>

     </target>

</project>

运行nant,效果如下图:

 

 

 

c)       从源代码管理器上获得代码

只需要添加这个target即可,然后去run这个target里面调用就可以了。这样,我们在运行nant的时候,就会先去服务器端获取代码,然后再去执行其他操作。

<target name="getCodeFromVss">

         <vssget username="username" password="******" recursive="true" replace="true" localpath="F:\Test\NAntTest\Test1" dbpath="D:\SourceSafe6.0d\TEST1\srcsafe.ini" path="$/"/>

</target>

说明:在用这个功能之前必须确保将NAntContrib目录下bin文件夹里的所有文件都拷贝到NAnt安装目录下的bin文件夹里, 这样默认没有vssget task的NAnt里就具可以调用vssget task了

vssget:是NAntContrib的语法,用来从VSS源码管理器上下载源代码,user和password属性表示登录VSS服务器的信息;Localpath属性是指下载的源代码存放的路径;recursive="true"表示递归获取代码;replace="true"表示如果本地有重复文件,则进行覆盖;dbpath定义VSS的srcsafe.ini文件的路径信息,包括srcsafe.ini文件名;path定义了要获取的源代码在VSS数据库中的路径,一般都是以$/为根目录。

d)       运行单元测试

首先,将我们的项目Test1中添加要进行单元测试的类,名为NUnitTarget.cs,代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using NUnit.Framework;

namespace Test1

{

    [TestFixture]

    public class NUnitTarget

    {

        [Test]

        public void Test()

        {

            Assert.AreEqual(1, 1);

        }

    }

}

十分简单,仅做测试用。Ok,编译解决方案,用Nunit.exe打开Test.exe,点击按钮“run”,效果如图:

 

 

这只是用Nunit这个工具,去进行,我们要做的是在NAnt里面自动的进行单元测试。OK,编写我们的default.build,

          <target name="NUnit">

              <nunit2>

                   <formatter type="Xml" usefile="true" extension=".xml" outputdir="."/>

                   <test assemblyname="F:\Test\NAntTest\Test1\Test1\bin\Debug\Test1.exe" haltonfailure="false" />

              </nunit2>

</target>

运行nant后,效果如下图:

 

 

说明::<formatter>标签中,type="Xml"表明了根据测试结果生成XML结构化信息,usefile="true"表明使用文件保存测试结果,extension=".xml"表明生成的文件扩展名为xml,outputdir指出了文件将被保存到哪个目录

Test标签中的assemblyname表明了被测试的dll程序集的路径信息,haltonfailure="false"表明即使测试没有通过仍然继续执行脚本文件

这样在测试命令完成后,会在outputdir指出的目录下生成一个XML形式的报告文件,名为Test1.exe-results.xml(格式为:Test1.exe+‘-’+results.xml)。为了增加测试结果的可读性,可以使用另一个工具NUnit2Report,将测试结果转换为直观的HTML文件。

脚本如下:

<nunit2report todir="F:\Test\NAntTest">

              <fileset>

                   <includes name="Test1.exe-results.xml"/>

              </fileset>

</nunit2report>

运行nant,效果如图:

 

 

此时会在目录F:\Test\NAntTest下面产生一个文件index.html(好像可以指定,我现在还不知道怎么指定),打开这个文件如图所示:

 

 

说明:includes标签用来搜索符合条件的XML文件,转换出来的HTML文件保存为out指出的文件名(好像可以指定文件名,但我指定的时候有错误,提示:Unexpected attribute “out” on element <nunit2report>),todir指出了HTML文件将保存的目录信息

e)       检查代码规范

安装以后,配置一下环境变量,这样在哪里都可以调用到fxcopcmd了。在系统目录的C:"WINDOWS下面建立一个fxcopcmd.bat的批处理文件,编辑内容如下:

@echo off

"D:\Program Files\Microsoft FxCop 1.36\FxCopCmd.exe" %*

保存OK。 

Fxcop的应用:

打开Microsoft FxCop 1.36,新建一个project,然后添加targets,将我们的项目Test1中bin下的Test1.exe添加进来,然后保存成Test1.Fxcop.同理将Test2保存成Test2.Fxcop.

然后编写default.build文件:

<target name="fxcop">

         <exec program="Fxcopcmd /project:F:\Test\NAntTest\Test1.Fxcop /out:F:\Test\NAntTest\Test1-Fxcop.xml"/>

         <exec program="Fxcopcmd /project:F:\Test\NAntTest\Test2.Fxcop /out:F:\Test\NAntTest\Test2-Fxcop.xml"/>

</target>

运行nant,出错,效果如下图:

 

 

可是如果我单独运行Fxcopcmd /project:F:\Test\NAntTest\Test1.Fxcop /out:F:\Test\NAntTest\Test1-Fxcop.xml就没有问题,而且会产生一个xml文件。突然想起来,将它们放入批处理文件中,建立两个批处理文件:Test1fxcp.bat和Test2fxcop.bat。

内容就是

Fxcopcmd /project:F:\Test\NAntTest\Test1.Fxcop /out:F:\Test\NAntTest\Test1-Fxcop.xml

Fxcopcmd /project:F:\Test\NAntTest\Test2.Fxcop /out:F:\Test\NAntTest\Test2-Fxcop.xml

这是直接在default.build里面调用这两个批处理,形如:

          <target name="fxcop">

              <exec program="Test1Fxcop.bat"/>

              <exec program="Test2Fxcop.bat"/>

</target>

运行nant,效果如图:

 

 

用IE打开产生的xml文件,效果图如下:

 

 

OK,搞定。

说明:

Project:是用Microsoft FxCop 1.36产生的project。

Out:是输出路径

         或者:

              两个批处理文件中的内容如下:

Fxcopcmd /f:F:\Test\NAntTest\Test1\Test1\bin\Debug\Test1.exe /out:F:\Test\NAntTest\Test1-Fxcop.xml

Fxcopcmd /f:F:\Test\NAntTest\Test2\Test2\bin\Debug\Test2.exe /out:F:\Test\NAntTest\Test2-Fxcop.xml

         同样可以。这样就不需要我们使用Microsoft FxCop 1.36去建立两个project了。很方便。

         说明:

              f:应该是要审查的文件

              out/o:输出路径

 

现在告一段落,以后会陆续补充 

参考:

     http://www.cnblogs.com/coolbug/archive/2004/07/21/26211.html

     http://www.cnblogs.com/mywebname/articles/600278.html

     http://www.cnblogs.com/coolbug/articles/27735.html

多谢CoolBug,在他那里,我学到了不少的东西。谢谢。

 

 

作者:冰碟
出处:http://www.cnblogs.com/icebutterfly/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任