使用NAnt提高工作效率(二)

首先,我们来定义一个工作的目录,如下图



接着,我们按如下的步骤,逐步完成一些学习和测试
1.      新建一个名为Learn的Project,放在NAnt工作目录下,我们看到它有几个属性:
Name 这个属性说明是必填的,就是Project的名称
Default 这里需要输入默认执行的Target,输入一个Target的名称,比如copy-learn
Basedir 就是Project的工作目录,这里输入 . 。表示是当前目录
2.      关于Property。Property这里相当于定义变量,定义完之后在下面的变量或者Target中可以通过${PropertyName}访问
假设,我们设置了一个Property ,其name=”output.dir” value=” I:\Workshop\Marvin\MyProgram\LearnDemo\NAnt\LearnDemo\NAnt学习\最终输出目录”,则,后面直接输入${output.dir}则表示上面设置的目录。这样有啥好处,就跟你使用变量一样
3.      新建Target,名为copy-learn。这里有几个属性:
Name Target的名称
Depends 就是依赖的Target,这里需要输入Target的名称,有多个,则使用,分隔。假设这里输入:delete-learn,zip-learn。则说明:在执行copy-learn这个Target之前的,需要按顺序执行delete-learn和zip-learn这两个Target
接着在这个Target下,我们添加一个copy的动作。直接输入copy或者下拉选择到copy,
Editor4NAnt或自动弹出一个对话框,让你填入相关的属性:
File 要被拷贝的文件
ToFile拷贝到的文件
ToDir 要拷贝到的目录

还有其他属性,暂时没有研究,但是这几个属性我们已经足够完成不少事情了


点击file对应的…按钮,弹出如下的对话框



同样我们输入tofile,最终的结果如下

1     <target name="copy-learn">
2         <copy file="${copy-src-dir}\a.txt" tofile=".\test.abc" />
3     </target>

这个时候点击Execute,会在learn.build这个目录下生成一个a.txtcopy,并且重命名为test,后缀名为abc

是不是很简单。

呵呵,当然,我们可能不单单是复制一个文件,可能是复制一个文件夹,复制一个文件夹到另外一个文件夹

如果要复制到另外一个文件夹而不是另外一个文件,则只需填写todir而不是填写tofile

如果要从一个文件夹复制,那我们就不能填写file了,需要在copy这个节点下再添加一个子节点。选择到copy这个节点,然后点击Add,则会出现Copy节点下能够录入的子节点



这里我们选择fileset
然后,我们在basedir中录入要copy的目录,点击ok确定。
再回来我们点击execute,等等,怎么没有文件copy过去?别着急,那是因为你没有选择相关的文件。我们再在fileset下点击,会出现另外一些的子节点,这里,我们选择include
然后再include的name属性中输入*,表示会把当前目录下的所有文件复制过去。
这时再点击Execute,是不是有文件复制过去了。

这时我们在点击一下Execute,嗯,这次怎么没有文件复制了呢,那是因为NAnt默认只复制有变化的文件。有时我们如果不确定,则须先删除原先复制的文件。

-         如果需要排除一些文件,怎么办?那就输入exclude属性 

-         如果要复制子文件夹下的文件怎么办?那name就这么写:**/*。这里好像是用*作分隔符。

-         如果需要include多个类型和Exclude多个类型,则一直添加下去即可。而且后面的属性会覆盖前面的属性

最终的结果如下:

1     <target name="copy-learn2">
2         <copy todir="CopyDestination">
3             <fileset basedir="${copy-src-dir}">
4                 <include name="**/*" />
5                 <exclude name="*.pdb" />
6                 <exclude name="*.db" />
7             </fileset>
8         </copy>
9     </target>

 

对于其他的includes,includefile,includelist我也不懂,希望有高手指点下。
下面再说说delete等其他属性,但就不截图了,直接根据生成的Xml说要点即可。
Delete:
属性有file,dir等。File指定删除文件,dir指定删除目录。如果还不能满足,则需要定义其下的fileset属性。用法同copy

1     <target name="delete-learn">
2         <delete dir="${copy-src-dir}" />
3     </target>

以上是删除${copy-src-dir}这个目录

 

Zip
属性必填是
zipfile,指的是压缩后的名称,需要同时指定后缀名。

 

 

1     <target name="zip-learn">
2         <zip zipfile="test.rar">
3             <fileset basedir="${copy-src-dir}">
4                 <include name="**/*" />
5             </fileset>
6         </zip>
7     </target>


 

上面的Target${copy-src-dir}下的所有文件包括子文件夹压缩为test.rar,同时保存到build文件的目录中。

 

Svn-update

Editor4NAnt已经支持这个命令

必填的为SVNUrl地址。
一般还要填写的是用户名、用户密码、还有要更新的目录

 

1     <target name="svn-learn">
2         <svn-update uri="https://localhost:8088/svn/test" username="marvin" password="marvin" destination="${copy-src-dir}"></svn-update>
3     </target>

 
上述Target,点击之后会从test这个svn中更新内容到${copy-src-dir}这个目录。
点击Execute,这个时候你会发现NAnt还是不能使用svn-update这个命令的,因为NAnt默认是不支持的。我们这时需要NAntContrib这个NAnt扩展。从网下下载回来(需要的也可以问我要),然后解压,把bin目录下的所有内容拷贝到NAnt的bin目录下。这时这个命令可以为NAnt用了。
不过我们点击Execute还是会发现svn.exe没有找到。因此你需要告诉NAntsvn的目录。怎么告诉,就是设置环境变量。把svn的bin目录加到path这个环境变量中,重启电脑。这个时候我们点击Execute,呵呵,终于自动从Svn中更新内容了。

再讲一个call指令。
这个指令主要是用来调用其他Target的。
一般我在project中定义一个publish的default target,在这个target中使用call调用其他target,就可以完成很多内容了。

上述用到project对应的xml如下:

 1 <?xml version="1.0" encoding="utf-16"?>
 2 <project name="learn" default="copy-learn" basedir="." xmlns="http://nant.sf.net/schemas/nant.xsd">
 3     <property name="copy-src-dir" value="I:\Workshop\Marvin\MyProgram\LearnDemo\NAnt\LearnDemo\NAnt学习\被Copy的文件夹" />
 4     <target name="copy-learn">
 5         <copy file="${copy-src-dir}\a.txt" tofile=".\test.abc" />
 6     </target>
 7     <target name="copy-learn2">
 8         <copy todir="CopyDestination">
 9             <fileset basedir="${copy-src-dir}">
10                 <include name="**/*" />
11                 <exclude name="*.pdb" />
12                 <exclude name="*.db" />
13             </fileset>
14         </copy>
15     </target>
16     <target name="delete-learn">
17         <delete dir="${copy-src-dir}" />
18     </target>
19     <target name="zip-learn">
20         <zip zipfile="test.rar">
21             <fileset basedir="${copy-src-dir}">
22                 <include name="**/*" />
23             </fileset>
24         </zip>
25     </target>
26     <target name="svn-learn">
27         <svn-update uri="https://localhost:8088/svn/test" username="marvin" password="marvin" destination="${copy-src-dir}"></svn-update>
28     </target>
29     <target name="publish">
30         <call target="copy-learn" />
31         <call target="delete-learn" />
32         <call target="svn-learn" />
33     </target>
34 </project>
原文地址:https://www.cnblogs.com/marvin/p/nantlearn2.html