2013-08-07 20 views
7

È possibile che questo sceneggiatura implementa if dir_is_empty then git-clone else git-fetch usando Ant-1.7.1 affermazioni fondamentali:eseguire task Ant se due condizioni sono soddisfatte

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

(vedi my other post)


Ma come implementare un target abilitato da due condizioni?

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

mia attuale tentativo:

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

[...] 

Io preferirei Ant-1.7.1 dichiarazioni core. Ma io sono aperto ad altre possibilità come Ant contrib, o embedded script ... Sentitevi liberi di inviare le vostre idee ...

(Vedere anche domanda Execute ANT task just if a condition is met)

risposta

7

Anche quando tenuti a Ant 1.7.1 è possibile combinare le 3 obiettivi chk in uno, vedere la parte condition nello snippet. Da Ant 1.9.1 (meglio usare Ant 1.9.3 a causa di bug in Ant 1.9.1 see this answer for details) è possibile aggiungere if and unless attributes su tutte le attività e gli elementi annidati, quindi non è necessario alcun target aggiuntivo, ad es. :

<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

Dalla documentazione su targets:

È possibile specificare un solo nome di proprietà nella clausola if/unless. Se si desidera controllare più condizioni, è possibile utilizzare un obiettivo dependend per calcolare il risultato per il controllo:

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

Inoltre, ci sono state alcune discussioni su [email protected] e user @ formica .apache.org mailing-list:


Ad esempio, la seguente target combina due proprietà (dir.exist e dir.noempty) per creare un altro (cloned) utilizzando operatori <and> e <istrue> (molti altri operators are documented come <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> 

È possibile che questo property"cloned" è utilizzato da obiettivi git.clone e git.fetch come segue:

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