上述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或embedded script等其他可能性持开放态度......随意张贴您的想法......
答案 0 :(得分:9)
即使绑定到Ant 1.7.1,您也可以将3个chk目标合并为一个,请参阅代码段中的condition部分。
从Ant 1.9.1开始(由于Ant 1.9.1 see this answer for details中的错误,最好使用Ant 1.9.3),可以在所有任务和嵌套元素上添加if and unless attributes,因此不需要额外的目标,例如: :
<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>
答案 1 :(得分:4)
只能在
if
/unless
子句中指定一个属性名。 如果要检查多个条件,可以使用dependend目标来计算检查结果:<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邮件列表的讨论:
例如,以下target
结合了两个属性(dir.exist
和dir.noempty
),以使用运算符cloned
和{{创建另一个属性<and>
) 1}}(许多其他operators are documented为<istrue>
,<or>
,<xor>
,<not>
,<isfalse>
,<equals>
)。< / p>
<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