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



上述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.existdir.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.clonegit.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>

相关内容

  • 没有找到相关文章

最新更新