前言:
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
出处:http://www.cnblogs.com/icebutterfly/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
今天的文章Nant学习总结分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/54287.html