我有一个场景,需要将目录从一个位置移动到另一个位置。如果目标文件夹中存在相同的目录,我需要将目录名重命名为oldname_1。所以我写了一个片段如下:
<target name="Move">
<IF>
<available file="${output.dir}" type="dir" />
<then>
<echo message="Directory exists" />
<rename src="${output.dir}" dest="${output.dir}_1"/>
<property name="newdirectory" value="${dest}"/>
</then>
<ELSE>
<echo message="Directory does not exist" />
</ELSE>
</IF>
<move file="${newdirectory}" todir="C:reports" />
</target>
我得到的错误是:
问题:无法创建任务原因:名称未定义。操作:检查拼写。操作:检查是否已声明任何自定义任务/类型。措施:检查是否已进行任何/声明。
正如Ian Roberts已经提到的,您需要Ant Contrib jar,然后设置<taskdef/>
来指向这个jar。我强烈建议将它放在您的项目中,并将其检查到您的版本控制系统中。这样,当有人签出你的项目时,他们已经安装了Ant-Contib.jar。
我的标准是把构建所需的所有可选jar(而不是编译所需的jar)放在目录${basedir}/antlib
中,然后把每个可选jar放在自己的目录中,所以我会把ant-contrib-1.0b3.jar
放在${basedir}/antlib/antcontrib
中。
然后我这样定义任务:
<property name="antlib.dir" value="${basedir}/antlib"/>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<fileset dir="${antlib.dir}/antcontrib"/>
</classpath>
</taskdef>
这样,如果您将jar文件更新为Ant Contrib jar的新版本,只需将其插入目录即可。您不必更新build.xml
。
还要注意,我使用的是net/sf/antcontrib/antlib.xml
,而不是net/sf/antcontrib/antcontrib.properties
。XML文件是应该使用的文件。这方面的说明在任务页面上,与主页上安装说明下的说明不同。原因是XML文件具有<for>
任务的正确定义,而属性文件没有。
然而,还有另一种方法可以在Ant 1.9.1中执行if
和unless
,而不需要可选的jar文件。这些是新的"如果"one_answers"除非"实体属性。
这些可以放在所有任务或子实体中,通常可以取代Ant-Contrib if/else
的东西:
<target name="move">
<available file="${output.dir}" type="dir"
property="output.dir.exists"/>
<echo message"Directory exists"
if:true="output.dir.exists"/>
<move file="${output.dir}" tofile="${output.dir}_1"
if:true="output.dir.exists"/>
<property name="newdirectory" value="${dest}"
if:true="output.dir.exists"/>
<echo message="Directory does not exists"
unless:true="output.dir.exists"/>
<move file="${newdirectory}" todir="C:reports" />
</target>
不像你的例子那样干净。然而,我会在目标名称上使用if=
和unless=
参数:
<target name="move.test">
<available file="${output.dir}" type="dir"
property="output.dir.exists"/>
</target>
<target name="move"
depends="move.test, move.exists, move.does.not exists">
<move file="${newdirectory}" todir="C:reports" />
</target>
<target name="move.exists"
if="output.dir.exists">
<echo message="Directory exists" />
<move file="${output.dir}" tofile="${output.dir}_1"/>
<property name="newdirectory" value="${dest}"/>
</move.exists/>
<target name="move.does.not.exists"
unless="output.dir.exists"/>
<echo message="Directory does not exist" />
</target>
如果你不回声所有的东西,结构会更干净一点:
<target name="move.test">
<available file="${output.dir}" type="dir"
property="output.dir.exists"/>
</target>
<target name="move"
depends="move.test, backup">
<move file="${newdirectory}" todir="C:reports" />
</target>
<target name="backup"
if="output.dir.exists">
<move file="${output.dir}" tofile="${output.dir}_1"/>
<property name="newdirectory" value="${dest}"/>
</move.exists/>
if/else构造不是Ant开箱即用的本地部分,它是由Ant contrib项目提供的,您需要下载一个JAR并将相关的<taskdef>
添加到构建文件中。例如,如果您下载ant-contrib-1.0b3.jar,并将其放在名为build
的目录中,该目录与您的build.xml位于同一目录中,那么您可以说
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="build/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>