【问题标题】:Conditionally Delete in AntAnt中的有条件删除
【发布时间】:2023-03-27 01:43:02
【问题描述】:

如果属性“delete-compiled-dir”设置为 true,我想删除目录。如果属性为假,则不要执行它。现在我有

<target name="deleted-after-compilation" depends="compile,jar">
        <condition property="${delete-compiled-dir}" value="true">
            <delete dir="${compilation-dir}" />
        </condition>
            <echo> Deleting Compiled Directory Classes </echo>
    </target>

我收到错误消息:

condition doesn't support the nested "delete" element.

【问题讨论】:

  • 问题是什么?你有什么问题吗?
  • 是的。该条件显然不支持删除元素。

标签: java ant conditional-statements


【解决方案1】:

您可以使用if 将条件添加到您的目标(请参阅manual)。

只有在设置属性compilation-dir(设置为任何值,例如false)时才会执行目标。

<target name="deleted-after-compilation" depends="compile,jar"
        if="${compilation-dir}">
    <delete dir="${compilation-dir}" />
    <echo> Deleting Compiled Directory Classes </echo>
</target>

要仅在属性设置为true 时执行它,您需要先设置另一个属性并在if 中检查该属性。您可以将两者都添加为另一个目标的依赖项:

<target name="set-delete-property">
    <condition property="delete-compilation-dir">
        <istrue value="${compilation-dir}"/>
    </condition>
</target>

<target name="deleted-after-compilation"
      depends="compile,jar" if="${compilation-dir}">
    ....

<target name="some-target"
      depends="set-delete-property,deleted-after-compilation">
</target>

【讨论】:

  • 如果属性为假,我不希望它执行。
  • (我目前无法测试,但应该可以这样)
【解决方案2】:

有几种方法可以做到这一点:

在目标实体上使用条件

目标可以包含ifunless 条件。目标将根据是否设置属性来执行。 (未设置为 true,只需设置)。这是查看您是否需要做某事的常用方法:

<target name="deleted.after.compilation" 
    if="delete.compiled.dir"
    depends="jar">
        <delete dir="${compilation-dir}" />
        <echo> Deleting Compiled Directory Classes </echo>
</target>

可以在命令行设置属性:

$ ant -Ddelete.compiled.dir all

注意:我使用句点作为属性和目标名称的分隔符。另请注意,我只依赖于目标jar,因为jar 也依赖于compile,因此无需同时拥有它们。

使用 Ant 的 1.9.1 条件子句

从 Ant 1.9.1 开始,Ant 具有可以添加到任务的 conditional attributes。您需要在 &lt;project&gt; 实体中添加 Namepsace 声明

<project ... 
    xmlns:if="ant:if"
    xmlns:unless="ant:unless">

    <target name="deleted.after.compilation" 
        depends="jar">
        <delete dir="${compilation-dir}" if:true="${delete.compiled.dir}"/>
        <echo if:true="${delete.compiled.dir}"> Deleting Compiled Directory Classes </echo>
    </target>

使用 Ant-Contrib 的 If Statement

哈哈,那个古怪的 Ant-Contrib 库。没有人知道是谁在维护它,而且很多年都没有动过它,但是很多人非常依赖它。

<project ...>
    <taskdef resource="net/sf/antcontrib/antlib.xml">
        <classpath>
            <fileset dir="${ivy.dir}/antcontrib">
                <include name="ant-contrib*.jar"/>
            </fileset>
        </classpath>
    </taskdef>

    <target name="deleted.after.compilation" 
        depends="jar">
        <if>
            <istrue value="${delete.compiled.dir}"/>
            <then>
                <delete dir="${compilation-dir}"/>
                <echo>Deleting Compiled Directory Classes </echo>
            </then?
        </if>
    </target>

您可以看到 Ant-Contrib 受欢迎的原因。它蕴含着巨大的力量,我们都知道。另外,如果有人仍在使用 Ant 1.8 或 1.7,这仍然可以工作。

【讨论】:

    【解决方案3】:

    如果你得到了这个属性,你可以在目标中使用它。

    <target name="delete" if="${delete-compiled-dir}">
        <delete dir="${compilation-dir}" />
    </target>
    

    【讨论】:

      【解决方案4】:

      从 Ant 1.9.1 开始,您可以对任何任务使用条件。描述here

      将此命名空间添加到您的项目元素:

      <project name="yourproject" xmlns:if="ant:if">
      

      然后将其添加到您的删除中:

      <delete dir="${compilation-dir}" if:true="${delete-compiled-dir}"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2011-02-01
        • 2018-09-24
        • 1970-01-01
        相关资源
        最近更新 更多