2013-08-07 12 views
7

Der obige Skript implementiert if dir_is_empty then git-clone else git-fetch mit Ant-1.7.1 Kernaussagen erfüllt sind:Ant-Task ausführen, wenn zwei Bedingungen

<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> 

(siehe my other post)


Aber wie ein implementieren target durch zwei Bedingungen aktiviert?

if dir_does_not_exist or dir_is_empty then git-clone else git-fetch

mein aktueller Versuch:

<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> 

[...] 

Ich würde Ant-1.7.1 Kernaussagen bevorzugen. Aber ich bin offen über andere Möglichkeiten als Ant contrib oder embedded script ... Fühlen Sie sich frei, Ihre Ideen zu veröffentlichen ...

(auch Execute ANT task just if a condition is met siehe Frage)

Antwort

7

Selbst wenn Ant gebunden 1.7.1 Sie Ihre 3 chk Ziele miteinander kombinieren können, finden Sie in der condition Teil im Schnipsel. Seit Ant 1.9.1 (besser verwenden Sie Ant 1.9.3 wegen der Fehler in Ant 1.9.1 see this answer for details) es ist möglich, if and unless attributes für alle Aufgaben und verschachtelten Elemente hinzuzufügen, so dass kein zusätzliches Ziel benötigt wird, z. :

<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> 
2

Von der Dokumentation auf targets:

In der Klausel if/unless kann nur ein Merkmalname angegeben werden. Wenn Sie mehrere Bedingungen überprüfen mögen, können Sie ein abhängiges Ziel für die Berechnung des Ergebnisses für die Prüfung benutzen können:

<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> 
Außerdem

gab es einige Diskussionen über [email protected] und user @ ant .apache.org Mailing-Listen:


Zum Beispiel die folgenden target vereint zwei Eigenschaften (dir.exist und dir.noempty) ein anderes zu schaffen (cloned) mit Hilfe von Operatoren <and> und <istrue> (viele andere operators are documented als <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> 

Die obige property"cloned" wird durch Ziele git.clone und git.fetch wie folgt verwendet:

<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>