我是否可以检查Ant中目录(而不是文件)的存在?


71

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

我们可以检查文件的存在,但是我们也可以对文件夹执行同样的操作吗?

Answers:


103

您可以将可用任务的类型设置为“ dir”。

例如:

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

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

dir.check目标由两个doFoo和doBar需要,它设置dir.exists属性取决于可用任务的结果真的还是假的。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任务。


1
但这会将属性值设置为true。那我应该如何检查情况。我的意思是“如果”?
Chathuranga Chandrasekara

为什么验证目录dir.check在doFoo和doBar之后?不应该这样吗?@Rich Seller
Miguel Ortiz

@MiguelOrtiz的声明顺序无关紧要,执行仅取决于depends属性。我认为将“公共”目标放在顶部,将“私有”实用程序目标放在底部是更
干净的做法

31

这是一个将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. 

2
我喜欢此解决方案的简单性和表现力。安装ant-contrib.jar值得额外的繁重工作。
杰森·斯佩斯凯

9

这是我的解决方案,不需要设置属性并使用带有'if'或'unless'的目标:

巨集:

<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-contrib.jar这是一件好事。保持声明性而非程序性。
卡特兰2014年

但是更正:应该是$ {artifactDir}而不是@ {artifactDir}。
卡特兰2014年

我从我的实际构建脚本中复制了该使用示例,其中artifactDir是宏定义中的一个属性。我已将用法示例更改为可能传递参数而不是macrodef属性的更常见情况。谢谢!
bcody 2014年

1

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

<?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,定位目标属性
  • 如果可用条件为假,则将条件属性else值设置为属性,如果不设置该属性,则不设置变量。NotSet值与显式假值不同。
  • 调用任何目标,但if / unless属性定义其是否实际运行

http://ant.apache.org/manual/properties.html#if+unless
[If / Unless]在Ant 1.7.1和更低版本中,这些属性只能是属性名称。从Ant 1.8.0开始,您可以改为使用属性扩展。与旧样式相比,这为您提供了更多的灵活性。


1
5年后,我认为doCustomize应该是doMagic。
TonyG '19

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>

0

这是另一个涉及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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.