如果满足两个条件,则执行Ant任务

时间:2013-08-07 07:47:07

标签: ant conditional is-empty ant-contrib

上述脚本使用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>

(见my other post


但是如何实现由两个条件启用的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 contribembedded script等其他可能性持开放态度......随意张贴您的想法......

(另见问题Execute ANT task just if a condition is met

2 个答案:

答案 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)

来自上的targets文档:

  

只能在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.existdir.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