使用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,最终的结果如下
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>
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注马非码的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/marvin/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南