Come posso verificare l'esistenza di una cartella utilizzando Ant?Ho un modo per verificare l'esistenza di una directory in Ant (non in un file)?
Possiamo verificare l'esistenza di un file, ma possiamo fare lo stesso anche per una cartella?
Come posso verificare l'esistenza di una cartella utilizzando Ant?Ho un modo per verificare l'esistenza di una directory in Ant (non in un file)?
Possiamo verificare l'esistenza di un file, ma possiamo fare lo stesso anche per una cartella?
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.
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.
Mi piace la semplicità e l'espressività di questa soluzione. Ne è valsa la pena sollevare pesi addizionali per ottenere ant-contrib.jar installato. –
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}" />
Bello! Evita ant-contrib.jar che è una buona cosa. Mantiene il dichiarativo piuttosto che procedurale. – cartland
Correzione però: dovrebbe essere $ {artifactDir} non @ {artifactDir}. – cartland
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
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>
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à.
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>
Ma questo imposterà un valore di proprietà su true. Allora come dovrei controllare la condizione. Intendo qualsiasi "se"? –
Perché la verifica dir.check è dopo doFoo e doBar? non dovrebbe essere il contrario? @Rich Seller –