如果和除非在蚂蚁

时间:2011-04-13 03:01:28

标签: xml ant

我想澄清ANT脚本中的ifunless语句

我有以下代码:

<condition property="hasExtensions">
    <contains string="${Product_version}" substring="Extensions">
</condition>

<exec executable="${TrueCM_App}\ssremove.exe" unless="hasExtensions">
    ...
</exec>

这是否意味着如果<exec>不包含字符串Product_version,则上述"Extensions"会执行ssremove.exe?

然后相反的情况如何:如果它包含字符串"Extensions"?我的代码是这样的:

<condition property="hasExtensions">
    <contains string="${Product_version}" substring="Extensions">
</condition>
<!-- here below it does not have the string "Extensions" -->
<exec executable="${TrueCM_App}\ssremove.exe" unless="hasExtensions">
    ...
</exec>

<!-- below is for if it has the string "Extensions" -->
<exec executable="${TrueCM_App}\ssremove.exe" if="hasExtensions">
    ...
</exec>

5 个答案:

答案 0 :(得分:10)

您的逻辑是正确的,但我不确定<exec>任务是否接受ifunless属性。有关详细信息,请参阅docs

您可能需要将<exec>任务包装在检查条件的目标中。例如:

<condition property="hasExtensions">
    <contains string="${Product_version}" substring="Extensions">
</condition>

<target name="ssremove" unless="hasExtensions">
    <exec executable="${TrueCM_App}\ssremove.exe">
        ...
    </exec>
</target>

然后,如果你运行ant ssremove,我想你会得到你想要的东西。

答案 1 :(得分:7)

“exec”既不支持,也不支持,所以ChrisH的答案是正确的。 通常,您还会将条件包装在目标中,并使其成为另一个目标的依赖项:

<target name="-should-ssremove">
  <condition ...
</target>

<target name="ssremove" depends="-should-ssremove" unless="hasExtensions">
  ...

注意用连字符(-should-ssremove)启动目标的惯用语,禁止从命令行使用它。 (你不能做'ant -should-ssremove',因为蚂蚁会将它视为一个参数而不是一个目标 - 这在蚂蚁手册中有记载)

在这种情况下使用的另一个聪明的习语,也来自手册,是利用if / unless和new(自Ant 1.8)扩展和与true / false比较的旧“已定义”含义。 / p>

这会给你:

<target name="-should-ssremove" unless="hasExtensions">
  <condition ...
</target>

<target name="ssremove" depends="-should-ssremove" unless="${hasExtensions}">
  ...

注意区别:第一个目标使用普通旧目标,除非第二个目标扩展变量 hasExtensions(使用$ {},而第一个目标中没有使用)并且仅在第一个目标中运行扩展为true(这是'available'将在其上设置的默认值,但您可以通过将'value'属性添加到'available'来设置)

这个习惯用法的优点是你可以在外部设置hasExtensions属性,在导入这个属性的文件中(比如build.xml)或在命令行上设置:

 ant -DhasExtensions=true ssremove

这是有效的,因为如果hasExtensions已经定义,那么-should-ssremove目标将不会运行(其中,pre-1.8是if / unless支持的唯一逻辑)。因此,您的外部定义胜过-should-ssremove。 另一方面,仅当属性hasExtensions 评估为false 时,ssremove目标才会运行。并且它总是由它检查的时间定义 - 感谢依赖-should-ssremove。

答案 2 :(得分:6)

Ant 1.9.1 以来,可以在所有任务和使用特殊命名空间的嵌套元素上添加 if 除非属性:

xmlns:if="ant:if"
xmlns:unless="ant:unless"

请参阅If And Unless

<project name="tryit" xmlns:if="ant:if" xmlns:unless="ant:unless">
    <condition property="onmac">
        <os family="mac" />
     </condition>
     <echo if:set="onmac">running on MacOS</echo>
     <echo unless:set="onmac">not running on MacOS</echo>
</project>

它还支持if:true / unless:true和if:blank / unless:blank。

答案 3 :(得分:1)

ant contrib中还有 if 任务。我个人认为使用 if 任务比使用条件目标的ant脚本更容易阅读。 然而, if 任务在ant社区中是不受欢迎的,如果你不打算做很多有条件的东西,你可能想要使用ChrisH的解决方案。

答案 4 :(得分:1)

<condition property="myStatus" value="My test is OK" else="My test is KO">
    <available file="${filePath}/${fileName}.txt"/>
</condition>
<echo message="${myStatus}" />