2009-02-06 21 views
145

Esiste un'attività ANT che eseguirà un blocco solo se esiste un determinato file? Ho il problema che ho uno script ant formico che dovrebbe fare qualche elaborazione speciale ma solo se è presente un file di configurazione specifico.Task Ant per eseguire una destinazione Ant solo se esiste un file?

+0

Vedi anche [Come usa il jolly nel comando Disponibile di Ant] (http://stackoverflow.com/questions/1073077/how-to-use-wildcard-in-ants-available-command/) – Vadzim

risposta

192

Available e Condition

<target name="check-abc"> 
    <available file="abc.txt" property="abc.present"/> 
</target> 

<target name="do-if-abc" depends="check-abc" if="abc.present"> 
    ... 
</target> 
+8

Available è un nome non così ovvio per quello che fa. Mi sono ulteriormente confuso dal fatto che google mostra che le persone che scrivono i loro tag –

+2

non sembrano funzionare con Ant 1.6.2. – djangofan

+0

Ha funzionato bene per me (Ant 1.8.2). Grazie. –

115

Questo potrebbe rendere un po 'più senso da un punto di vista di codifica (disponibile con la formica-contrib: http://ant-contrib.sourceforge.net/):

<target name="someTarget"> 
    <if> 
     <available file="abc.txt"/> 
     <then> 
      ... 
     </then> 
     <else> 
      ... 
     </else> 
    </if> 
</target> 
+34

Questo è disponibile solo in ant-contrib, penso. –

+0

Perfetto. Grazie, Adam. –

+0

Preferisco decisamente questa sintassi –

25

Dal 1.8.0 Ant c'è a quanto pare anche resourceexists

Da http://ant.apache.org/manual/Tasks/conditions.html

Test di una risorsa per l'esistenza. since Ant 1.8.0

La risorsa effettiva da testare è specificata come elemento nidificato.

Un esempio:

<resourceexists> 
    <file file="${file}"/> 
</resourceexists> 

Stavo rielaborare l'esempio da quanto sopra buona risposta a questa domanda, e poi ho trovato questo

A partire dal 1.8.0 Ant, è può invece utilizzare l'espansione della proprietà ; un valore di true (o on o sì) abiliterà l'articolo, mentre false (o off o no) lo disabiliterà . Altri valori sono ancora assunto come nomi di proprietà e quindi l'elemento è abilitato solo se la proprietà denominata è definita.

Rispetto al vecchio stile, questo ti dà ulteriore flessibilità, perché si può escludere la condizione dalla riga di comando o il genitore script:

<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 di formica a http://ant.apache.org/manual/properties.html#if+unless

Speriamo che questo esempio sia utile per alcuni. Non stanno usando resourceexists, ma presumibilmente si potrebbe .....

+2

Nota che 'if =" $ {file.exists} "' dovrebbe essere sostituito con 'if =" file.exists "' come 'if' e' unless' controllano solo l'esistenza della proprietà per nome, non il suo valore. – Vadzim

+1

@Vadzim Come la risposta menzionata, funziona solo in Ant 1.8 e 1.8 supporta l'espansione delle proprietà. http://ant.apache.org/manual/properties.html#if+unless –

10

penso che il suo valore fa riferimento a questa risposta simile:? https://stackoverflow.com/a/5288804/64313

Ecco una un'altra soluzione rapida. Esistono altre varianti possibili su questo utilizzando il tag <available>:

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

si può fare ordinando di fare l'operazione con un elenco di file con nomi uguali al nome (s) è necessario. È molto più semplice e diretto che creare un bersaglio speciale. E non hai bisogno di strumenti aggiuntivi, solo pura Ant.

<delete> 
     <fileset includes="name or names of file or files you need to delete"/> 
    </delete> 

http://ant.apache.org/manual/Types/fileset.html

2

Verificare utilizzo di filtri Nome file come "DB _ */**/*. Sql"

Ecco una variante per eseguire un'azione, se uno o più file esistono corrispondente ad un carattere jolly filtro. Cioè, non si conosce il nome esatto del file.

Qui, siamo alla ricerca di file "* .sql" In ogni sotto-directory chiamata "DB_ *", in modo ricorsivo. È possibile regolare il filtro in base alle proprie esigenze.

NB: Apache Ant 1.7 e versioni successive!

Ecco l'obiettivo di impostare una proprietà se sono presenti 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 bersaglio "con riserva", che funziona solo se sono presenti file:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy"> 
    <!-- Do stuff here --> 
</target> 
Problemi correlati