Esiste un'attività ANT che eseguirà un blocco solo se esiste un determinato file? Ho il problema di avere uno script di formica generico che dovrebbe eseguire un'elaborazione speciale ma solo se è presente un file di configurazione specifico.
Esiste un'attività ANT che eseguirà un blocco solo se esiste un determinato file? Ho il problema di avere uno script di formica generico che dovrebbe eseguire un'elaborazione speciale ma solo se è presente un file di configurazione specifico.
Risposte:
<target name="check-abc">
<available file="abc.txt" property="abc.present"/>
</target>
<target name="do-if-abc" depends="check-abc" if="abc.present">
...
</target>
if
e unless
abilitano o disabilitano solo il target a cui sono collegati, cioè le dipendenze del target vengono sempre eseguite. Altrimenti non funzionerebbe per dipendere da una destinazione che imposta la proprietà che stai cercando.
<Available>
deprecato. Ho usato questo: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target>
controlla: nant.sourceforge.net/release/0.85/help/functions/…
<available>
è deprecato? 2: ${file::existst...}
sembra non funzionare con Ant (Apache ANT 1.9.7)
Questo potrebbe avere un po 'più senso dal punto di vista della codifica (disponibile con ant-contrib: http://ant-contrib.sourceforge.net/ ):
<target name="someTarget">
<if>
<available file="abc.txt"/>
<then>
...
</then>
<else>
...
</else>
</if>
</target>
Dal momento che Ant 1.8.0 sembra che esistano anche risorse
Da http://ant.apache.org/manual/Tasks/conditions.html
Verifica una risorsa per l'esistenza. dalla Ant 1.8.0
La risorsa effettiva da testare è specificata come elemento nidificato.
Un esempio:
<resourceexists> <file file="${file}"/> </resourceexists>
Stavo per rielaborare l'esempio dalla buona risposta sopra a questa domanda, e poi ho trovato questo
A partire da Ant 1.8.0, puoi invece utilizzare l'espansione della proprietà; un valore vero (o acceso o sì) abiliterà l'elemento, mentre falso (o spento o no) lo disabiliterà. Si presume che altri valori siano nomi di proprietà e quindi l'elemento è abilitato solo se la proprietà denominata è definita.
Rispetto allo stile precedente, ciò offre ulteriore flessibilità, poiché è possibile ignorare la condizione dalla riga di comando o dagli script padre:
<target name="-check-use-file" unless="file.exists"> <available property="file.exists" file="some-file"/> </target> <target name="use-file" depends="-check-use-file" if="${file.exists}"> <!-- do something requiring that file... --> </target> <target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>
dal manuale della formica su http://ant.apache.org/manual/properties.html#if+unless
Speriamo che questo esempio sia utile ad alcuni. Non stanno usando risorse esistenti, ma presumibilmente potresti? .....
if="${file.exists}"
dovrebbe essere sostituito con if="file.exists"
as if
e unless
controlla solo l'esistenza della proprietà per nome, non è valore.
Penso che valga la pena fare riferimento a questa risposta simile: https://stackoverflow.com/a/5288804/64313
Ecco un'altra soluzione rapida. Esistono altre varianti su questo usando il <available>
tag:
# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
<condition><not>
<available file="${file}" />
</not></condition>
</fail>
DB_*/**/*.sql
Ecco una variante per eseguire un'azione se uno o più file esistono corrispondenti a un filtro jolly. Cioè, non conosci il nome esatto del file.
Qui, stiamo cercando i file " * .sql " in qualsiasi sottodirectory denominata " DB_ * ", in modo ricorsivo. Puoi adattare il filtro alle tue esigenze.
NB: Apache Ant 1.7 e versioni successive!
Ecco l'obiettivo di impostare una proprietà se esistono file corrispondenti:
<target name="check_for_sql_files">
<condition property="sql_to_deploy">
<resourcecount when="greater" count="0">
<fileset dir="." includes="DB_*/**/*.sql"/>
</resourcecount>
</condition>
</target>
Ecco un target "condizionale" che viene eseguito solo se esistono file:
<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
<!-- Do stuff here -->
</target>
Puoi farlo ordinando di eseguire l'operazione con un elenco di file con nomi uguali ai nomi necessari. È molto più semplice e diretto che creare un obiettivo speciale. E non hai bisogno di altri strumenti, solo pura Formica.
<delete>
<fileset includes="name or names of file or files you need to delete"/>
</delete>
Vedi: FileSet .