我想澄清ANT脚本中的if
和unless
语句
我有以下代码:
<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>
答案 0 :(得分:10)
您的逻辑是正确的,但我不确定<exec>
任务是否接受if
和unless
属性。有关详细信息,请参阅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"
<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}" />