2009-07-22 4 views

risposta

90

Si utilizza l'attività available con tipo impostato su "dir".

Ad esempio:

<available file="${dir}" type="dir"/> 

Il metodo standard per fare l'elaborazione condizionale è con la condition task. Nell'esempio seguente, eseguendo doFoo verrà echo un messaggio se la directory esiste, mentre eseguendo doBar verrà echo un messaggio a meno che la directory esista.

Il dir.check bersaglio è richiesto sia doFoo e dobar, imposta la dir.exists proprietà true o false a seconda del risultato del compito disponibili. Il target doFoo verrà eseguito solo se propery è impostato su true e doBar verrà eseguito solo se non è impostato o impostato su false.

<?xml version="1.0"?> 
<project name="test" default="doFoo" basedir="."> 
    <property name="directory" value="c:\test\directory"/> 

    <target name="doFoo" depends="dir.check" if="dir.exists"> 
    <echo>${directory} exists</echo> 
    </target> 

    <target name="doBar" depends="dir.check" unless="dir.exists"> 
    <echo>${directory} missing"</echo> 
    </target> 

    <target name="dir.check"> 
    <condition property="dir.exists"> 
     <available file="${directory}" type="dir"/> 
    </condition> 
    </target> 
</project> 

Antelope fornisce ulteriori compiti, tra cui un'attività Se che può rendere l'elaborazione più semplice (e per me, più intuitivo), è possibile scaricare i compiti Antelope dalla download page.

+1

Ma questo imposterà un valore di proprietà su true. Allora come dovrei controllare la condizione. Intendo qualsiasi "se"? –

+0

Perché la verifica dir.check è dopo doFoo e doBar? non dovrebbe essere il contrario? @Rich Seller –

29

Ecco un piccolo esempio che incorpora l'elemento available in un test if.

<!-- Test if a directory called "my_directory" is present --> 
<if> 
    <available file="my_directory" type="dir" /> 
    <then> 
    <echo message="Directory exists" /> 
    </then> 
    <else> 
    <echo message="Directory does not exist" /> 
    </else> 
</if> 

Attenzione: è necessario ant-contrib.jar nella ANT_HOME \ lib altrimenti non sarà possibile accedere ai if elementi, e lo script fallirà con questo errore:

Problem: failed to create task or type if 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 
+2

Mi piace la semplicità e l'espressività di questa soluzione. Ne è valsa la pena sollevare pesi addizionali per ottenere ant-contrib.jar installato. –

8

Ecco la mia soluzione, che non richiede l'impostazione delle proprietà e l'utilizzo di obiettivi con 'se' o 'meno':

Macro:

<macrodef name="assertDirAvailable"> 
    <attribute name="dir" /> 
    <sequential> 
     <fail message="The directory '@{dir}' was expected to be available but is not"> 
      <condition> 
       <not> 
        <available file="@{dir}" type="dir" /> 
       </not> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

Usage:

<assertDirAvailable dir="${dirToCheck}" /> 
+0

Bello! Evita ant-contrib.jar che è una buona cosa. Mantiene il dichiarativo piuttosto che procedurale. – cartland

+0

Correzione però: dovrebbe essere $ {artifactDir} non @ {artifactDir}. – cartland

+0

Ho copiato quell'esempio di utilizzo da uno script di build vero e proprio in cui artifactDir era un attributo in un macrodef. Ho cambiato l'esempio di utilizzo per il caso più comune di passare un parametro piuttosto che un attributo macrodef. Grazie! – bcody

1

La mia soluzione utilizzando la versione 1.8 ANT, le versioni più vecchie potrebbe non funzionare a causa se/a meno che non supportano $ {} evalTrueOrFalse sintassi.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="DoMagic" default="build" basedir="."> 

<property environment="env" /> 
<property name="name" value="Do the ANT Magic" /> 
<property name="somedir" value="./must_exist_folder"/> 
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> 

<target name="doMagic" if="${dir.exists}"> 
    <echo message="Do the magic stuff" /> 
</target> 

<target name="doUsage" unless="${dir.exists}"> 
    <echo message="Do usage and help" /> 
</target> 

<target name="build"> 
    <echo message="Do the magic" /> 

    <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition> 
    <echo message="Folder found: ${dir.exists}" /> 
    <antcall target="doCustomize"></antcall> 
    <antcall target="doUsage"></antcall> 
</target> 

</project> 
  • ANT 1.6 o all'inizio ANT 1.7 non funziona, l'aggiornamento a 1.8 ANT rilascio. attribuisce
  • target se e meno viene valutata $ {var} sintassi per vero falso attributo Condizione/
  • altro valore è impostato su proprietà, se disponibili condizione era falsa, senza di essa variabile non è impostata. Il valore NotSet non è uguale a un valore falso esplicito.
  • chiamata qualsiasi bersaglio ma se/a meno che l'attributo definisce se la sua realtà gestita

http://ant.apache.org/manual/properties.html#if+unless
[Se/A meno] In 1.7.1 Ant e precedenti, questi attributi potrebbero essere solo nomi di proprietà. A partire da Ant 1.8.0, è possibile utilizzare l'espansione delle proprietà. Rispetto allo stile precedente, questo ti offre una maggiore flessibilità.

0

Ecco un altro approccio, consente di chiamare solo un'attività senza ant-contrib.jar.

<target name="my-task" depends="dir-check"> 
    <antcall target="my-task-install"/> 
    <antcall target="my-task-update"/> 
</target> 
<target name="my-task-install" unless="dir.exists" > 
    {some task} 
</target> 
<target name="my-task-update" if="dir.exists" > 
    {another task} 
</target> 
<target name="dir-check"> 
    <condition property="dir.exists"> 
     <available file="my-dir" type="dir" /> 
    </condition> 
</target>