zoukankan      html  css  js  c++  java
  • Nant学习总结

    前言:

         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/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
     
  • 相关阅读:
    powerdesigner简单使用
    linux进程间通信方式
    linux中fork()函数详解(原创!!实例讲解)
    platform_device与platform_driver
    当心不静的时候
    linux移植简介[MS2]
    使用maven的tomcat:run进行web项目热部署
    SpringMVC &amp; Struts2
    开放产品开发(OPD):OPD框架
    【Android个人理解(八)】跨应用调用不同组件的方法
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1351852.html
Copyright © 2011-2022 走看看