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


Answers:


200

可用条件

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

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

8
可用名称是一个不太明显的名称。我得到了进一步通过谷歌显示的人写自己的标签的事实混淆
马里奥奥特贡

它可能有效,但是如果您需要应用到大量文件,则似乎不是一个好的解决方案
cmcginty 2013年

4
万一有人怀疑,ifunless属性仅启用或禁用它们所连接的目标,即总是执行目标的依赖关系。否则,依靠目标来设置要检查的属性将不起作用。
sschuberth

似乎<Available>已弃用。我用这个: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> :检查nant.sourceforge.net/release/0.85/help/functions/...
卢瓦克

1
@Loïc1 它在哪里声明<available>已弃用?2: ${file::existst...}似乎无法与Ant(Apache ANT 1.9.7)一起使用
user85421 '17


26

从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(或启用或是)将启用该项目,而值为false(或禁用或否)将禁用该项目。其他值仍假定为属性名称,因此仅在定义了命名属性的情况下才启用该项目。

与较早的样式相比,这可以为您提供更多的灵活性,因为您可以从命令行或父脚本覆盖条件:

<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上的ant手册

希望这个例子对某些人有用。他们没有使用resourceexists,但是大概可以吗?


2
请注意,if="${file.exists}"应将其替换为if="file.exists"as,ifunless仅按名称检查属性的存在,而不是其值。
Vadzim

1
@Vadzim作为答案,它仅在Ant 1.8中有效,并且1.8支持属性扩展。ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky

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>

3

检查使用文件名过滤器,如 DB_*/**/*.sql

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

在这里,我们在任何称为“ DB_ * ”的子目录中递归查找“ * .sql ”文件。您可以根据需要调整过滤器。

注意: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>

这是一个“条件”目标,仅在文件存在时运行:

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

0

您可以通过命令使用名称等于所需名称的文件列表来执行此操作。这比创建一个特殊目标要容易和直接得多。而且您不需要任何其他工具,只需纯Ant。

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

请参阅:FileSet

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.