11

上面的脚本使用 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嵌入式脚本等其他可能性持开放态度......随时发表你的想法......

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

4

2 回答 2

11

即使绑定到 Ant 1.7.1,您也可以将 3 个 chk 目标合并为一个,请参阅代码段中的条件部分。由于 Ant 1.9.1(最好使用 Ant 1.9.3,因为 Ant 1.9.1 中的错误,请参阅此答案以获取详细信息),可以在所有任务和嵌套元素上添加if 和 unless 属性,因此不需要额外的目标,fe:

<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>
于 2013-10-09T12:29:50.400 回答
4

来自关于目标的文档:

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 邮件列表的讨论:


例如,以下target结合两个属性 (dir.exist和) 使用运算符和(许多其他运算符记录为, , , , , )dir.noempty创建另一个 ( )。cloned<and><istrue><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>
于 2013-10-09T09:19:58.723 回答