仅当文件存在时才运行Ant目标的Ant任务?

时间:2009-02-06 14:49:43

标签: file ant build-automation

是否存在仅在给定文件存在时才执行块的ANT任务?我有一个问题,我有一个通用的ant脚本应该做一些特殊的处理,但只有在存在特定的配置文件时。

6 个答案:

答案 0 :(得分:197)

AvailableCondition

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 

答案 1 :(得分:119)

从编码角度来看,这可能会更有意义(ant-contrib可用:http://ant-contrib.sourceforge.net/):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

答案 2 :(得分:25)

自Ant 1.8.0以来,显然还有资源存在

http://ant.apache.org/manual/Tasks/conditions.html

  

测试资源是否存在。以来   Ant 1.8.0

     

要测试的实际资源是   指定为嵌套元素。

     

一个例子:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

我是关于这个问题的上述好回答的例子,然后我找到了这个

  

从Ant 1.8.0开始,您可以改用   物业扩张;值为true   (或上或是)将启用该项目,   而假(或关或否)会   禁用它。其他价值仍然存在   假设是属性名称等等   仅当命名时才启用该项   属性是定义的。

     

与旧式相比,这个   为您提供额外的灵活性   因为你可以覆盖条件   从命令行或父级   脚本:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

来自http://ant.apache.org/manual/properties.html#if+unless

的蚂蚁手册

希望这个例子对某些人有用。他们没有使用资源存在,但可能你可以吗?.....

答案 3 :(得分:12)

我认为值得参考这个类似的答案:https://stackoverflow.com/a/5288804/64313

这是另一个快速解决方案。使用<available>标记可以使用其他变体:

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>

答案 4 :(得分:2)

使用DB_*/**/*.sql

等文件名过滤器进行检查

如果存在与通配符过滤器对应的一个或多个文件,则执行操作的变体如下。也就是说,您不知道文件的确切名称。

在这里,我们正在寻找&#34; * .sql &#34;递归地称为&#34; DB _ * &#34;的任何子目录中的文件。您可以根据需要调整过滤器。

NB:Apache Ant 1.7及更高版本!

如果存在匹配文件,则设置属性的目标是:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

这是一个&#34;条件&#34;仅在文件存在时才运行的目标:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>

答案 5 :(得分:0)

您可以通过命令使用名称等于您需要的名称的文件列表来执行此操作。它比创建特殊目标更容易和更直接。而且你不需要任何额外的工具,只需要纯粹的Ant。

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

请参阅:FileSet