上述ant脚本使用ant-1.7.1核心语句实现if dir_is_empty then git-clone else git-fetch
:
<target name="update" depends="git.clone, git.fetch" />
<target name="check.dir">
<fileset dir="${dir}" id="fileset"/>
<pathconvert refid="fileset" property="dir.contains-files" setonempty="false"/>
</target>
<target name="git.clone" depends="check.dir" unless="dir.contains-files">
<exec executable="git">
<arg value="clone"/>
<arg value="${repo}"/>
<arg value="${dir}"/>
</exec>
</target>
<target name="git.fetch" depends="check.dir" if="dir.contains-files" >
<exec executable="git" dir="${dir}">
<arg value="fetch"/>
</exec>
</target>
(见我的另一篇文章)
但是如何实现由两个条件启用的target
if dir_does_not_exist or dir_is_empty then git-clone else git-fetch
我目前的尝试:
<target name="git.clone"
depends="chk.exist, chk.empty"
unless="!dir.exist || dir.noempty" >
[...]
</target>
<target name="chk.exist">
<condition property="dir.exist">
<available file="${dir}/.git" type="dir"/>
</condition>
</target>
[...]
我更喜欢Ant-1.7.1核心声明。但我对Ant contrib或嵌入式脚本的其他可能性持开放态度。。。请随意发布您的想法。。。
(另请参阅问题"仅在满足条件时执行ANT任务")
即使绑定到Ant 1.7.1,您也可以将您的3个chk目标组合为一个,请参阅代码片段中的条件部分。自从Ant 1.9.1(由于Ant 1.9.1中的错误,最好使用Ant 1.9.3,请参阅此答案以了解详细信息)以来,可以在所有任务和嵌套元素上添加if和excess属性,因此不需要额外的目标,例如:
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<condition property="cloned" else="false">
<and>
<available file="${dir}/.git" type="dir" />
<resourcecount when="gt" count="0">
<fileset dir="${dir}/.git" />
</resourcecount>
</and>
</condition>
<exec executable="git" unless:true="${cloned}">
<arg value="clone" />
<arg value="${repo}" />
<arg value="${dir}" />
</exec>
<exec executable="git" dir="${dir}" if:true="${cloned}">
<arg value="fetch" />
</exec>
</project>
来自目标的蚂蚁文档:
在
if
/unless
子句中只能指定一个属性名称。如果你想检查多个条件,你可以使用依赖目标来计算检查结果:<target name="myTarget" depends="myTarget.check" if="myTarget.run"> <echo>Files foo.txt and bar.txt are present.</echo> </target> <target name="myTarget.check"> <condition property="myTarget.run"> <and> <available file="foo.txt"/> <available file="bar.txt"/> </and> </condition> </target>
此外,还就dev@ant.apache.org和user@ant.apache.org邮件列表:
- 在"if"one_answers"除非"条件中使用多个属性(2006年6月)
- 支持mutliple if and except(2008年8月)
- 蚂蚁目标满足多个条件(2008年10月)
例如,下面的target
组合了两个属性(dir.exist
和dir.noempty
),以使用运算符<and>
和<istrue>
创建另一个属性(cloned
)(许多其他运算符记录为<or>
、<xor>
、<not>
、<isfalse>
、<equals>
、<length>
)。
<target name="chk" depends="chk.exist, chk.empty" >
<condition property="cloned">
<and>
<istrue value="dir.exist" />
<istrue value="dir.noempty" />
</and>
</condition>
</target>
上述property
"cloned"
由目标git.clone
和git.fetch
使用如下:
<target name="update" depends="git.clone, git.fetch" />
<target name="git.clone" depends="chk" unless="cloned" >
<exec executable="git" >
<arg value="clone" />
<arg value="${repo}" />
<arg value="${dir}" />
</exec>
</target>
<target name="git.fetch" depends="chk" if="cloned" >
<exec executable="git" dir="${dir}">
<arg value="fetch"/>
</exec>
</target>
<target name="chk.exist" >
<condition property="dir.exist" >
<available file="${dir}" type="dir" />
</condition>
</target>
<target name="chk.empty" >
<fileset dir="${dir}" id="fileset" />
<pathconvert refid="fileset" property="dir.noempty" setonempty="false" />
</target>