我是否有办法检查 Ant 中是否存在一个目录(而不是一个文件) ?

如何使用 Ant 检查文件夹是否存在?

我们可以检查文件的存在,但是我们是否也可以对文件夹进行同样的检查呢?

85837 次浏览

使用类型设置为“ dir”的 有空任务。

例如:

<available file="${dir}" type="dir"/>

执行条件处理的标准方法是使用 条件任务条件任务条件任务。在下面的示例中,如果目录存在,运行 doFoo 将回显消息,而运行 doBar 将回显目录存在的消息 除非

DoFoo 和 doBar 都需要 长官,检查完毕目标,它根据可用任务的结果将 Dir. 存在属性设置为 true 或 false。DoFoo 目标只有在该属性设置为 true 时才会运行,而 doBar 只有在没有设置或设置为 false 时才会运行。

<?xml version="1.0"?>
<project name="test" default="doFoo" basedir=".">
<property name="directory" value="c:\test\directory"/>


<target name="doFoo" depends="dir.check" if="dir.exists">
<echo>${directory} exists</echo>
</target>


<target name="doBar" depends="dir.check" unless="dir.exists">
<echo>${directory} missing"</echo>
</target>


<target name="dir.check">
<condition property="dir.exists">
<available file="${directory}" type="dir"/>
</condition>
</target>
</project>

Antelope 提供了额外的任务,包括一个可以使处理更简单的 If 任务(对我来说,更直观) ,您可以从 下载页下载 Antelope 任务。

下面是一个将 available元素合并到 if测试中的小例子。

<!-- Test if a directory called "my_directory" is present -->
<if>
<available file="my_directory" type="dir" />
<then>
<echo message="Directory exists" />
</then>
<else>
<echo message="Directory does not exist" />
</else>
</if>

警告 : 您需要 ANT _ HOME lib 目录中的 ANT-Contrib.jar,否则您将无法访问 if元素,并且您的脚本将因此错误而失败:

Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.

下面是我的解决方案,它不需要设置属性和使用带有“如果”或“除非”的目标:

宏观:

<macrodef name="assertDirAvailable">
<attribute name="dir" />
<sequential>
<fail message="The directory '@{dir}' was expected to be available but is not">
<condition>
<not>
<available file="@{dir}" type="dir" />
</not>
</condition>
</fail>
</sequential>
</macrodef>

用法:

<assertDirAvailable dir="${dirToCheck}" />

我的解决方案使用 ANT 1.8版本,如果/除非不支持 ${ evalTrueOrFalse }语法,旧版本可能无法工作。

<?xml version="1.0" encoding="UTF-8"?>
<project name="DoMagic" default="build" basedir=".">


<property environment="env" />
<property name="name" value="Do the ANT Magic" />
<property name="somedir" value="./must_exist_folder"/>
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp>


<target name="doMagic" if="${dir.exists}">
<echo message="Do the magic stuff" />
</target>


<target name="doUsage" unless="${dir.exists}">
<echo message="Do usage and help" />
</target>


<target name="build">
<echo message="Do the magic" />


<condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition>
<echo message="Folder found: ${dir.exists}" />
<antcall target="doCustomize"></antcall>
<antcall target="doUsage"></antcall>
</target>


</project>
  • ANT 1.6或早期 ANT 1.7不工作,升级到 ANT 1.8版本。
  • 目标属性 如果除非将 ${ var }语法计算为 true/false
  • 如果可用条件为 false,则条件属性 别的值设置为 Property,如果没有该值,则不设置变量。NotSet 值与显式的 false 值不同。
  • 调用任何目标,但 if/until 属性定义其是否实际运行

Http://ant.apache.org/manual/properties.html#if+unless
在 Ant 1.7.1及更早版本中,这些属性只能是属性名。从 Ant 1.8.0开始,您可以改用属性扩展。与旧的样式相比,这为您提供了额外的灵活性。

下面是另一种方法,它允许在不使用 ant-Contrib.jar 的情况下调用一个任务。

<target name="my-task" depends="dir-check">
<antcall target="my-task-install"/>
<antcall target="my-task-update"/>
</target>
<target name="my-task-install" unless="dir.exists" >
{some task}
</target>
<target name="my-task-update" if="dir.exists" >
{another task}
</target>
<target name="dir-check">
<condition property="dir.exists">
<available file="my-dir" type="dir" />
</condition>
</target>

下面是另一个涉及 for循环的例子。如果目录不存在则失败。

<for list="dir1/, dir2/, dir3/" param="local.dir" >
<sequential>
<fail message="Directory @{local.dir} does not exist">
<condition>
<not>
<available file="@{local.dir}" type="dir" />
</not>
</condition>
</fail>
</sequential>
</for>