首先,我们来定义一个工作的目录,如下图
接着,我们按如下的步骤,逐步完成一些学习和测试
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,最终的结果如下
2 <copy file="${copy-src-dir}\a.txt" tofile=".\test.abc" />
3 </target>
这个时候点击Execute,会在learn.build这个目录下生成一个a.txt的copy,并且重命名为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多个类型,则一直添加下去即可。而且后面的属性会覆盖前面的属性
最终的结果如下:
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
2 <delete dir="${copy-src-dir}" />
3 </target>
以上是删除${copy-src-dir}这个目录
Zip
属性必填是zipfile,指的是压缩后的名称,需要同时指定后缀名。
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已经支持这个命令
必填的为SVN的Url地址。
一般还要填写的是用户名、用户密码、还有要更新的目录
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如下:
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>