Attività Ant per eseguire un target Ant solo se esiste un file?


Risposte:


200

Disponibile e condizioni

<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
Disponibile è un nome non così ovvio per quello che fa. Sono stato ulteriormente confuso dal fatto che Google mostra alle persone che scrivono i propri tag
Mario Ortegón,

potrebbe funzionare, ma non sembra una buona soluzione se devi applicare un numero elevato di file
cmcginty,

4
Nel caso qualcuno si chiedesse, gli attributi ife unlessabilitano 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.
sschuberth,

Sembra <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/…
Loïc

1
@ Loïc 1: dove afferma che <available>è deprecato? 2: ${file::existst...} sembra non funzionare con Ant (Apache ANT 1.9.7)
user85421

123

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>

36
Questo è disponibile solo in ant-contrib penso.
Richard Cook,

26

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


2
Nota che if="${file.exists}"dovrebbe essere sostituito con if="file.exists"as ife unlesscontrolla solo l'esistenza della proprietà per nome, non è valore.
Vadzim,

1
@Vadzim Come indicato nella risposta, questo funziona solo in Ant 1.8 e 1.8 supporta l'espansione della proprietà. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky

12

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>

3

Controlla usando i filtri di nome file come 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>

0

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 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.