Ant-Aufgabe, ein Ant-Ziel nur auszuführen, wenn eine Datei vorhanden ist?

153

Gibt es eine ANT-Task, die einen Block nur ausführen würde, wenn eine bestimmte Datei vorhanden ist? Ich habe das Problem, dass ich ein generisches Ant-Skript habe, das eine spezielle Verarbeitung durchführen sollte, aber nur, wenn eine bestimmte Konfigurationsdatei vorhanden ist.

Mario Ortegón
quelle

Antworten:

200

Verfügbar und Zustand

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

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
Toolkit
quelle
8
Verfügbar ist ein nicht so offensichtlicher Name für das, was es tut. Ich wurde weiter durch die Tatsache verwirrt, dass Google Leute zeigt, die ihre eigenen Tags schreiben
Mario Ortegón
es mag funktionieren, scheint aber keine gute Lösung zu sein, wenn Sie auf eine große Anzahl von Dateien
anwenden müssen
4
Falls sich jemand wundert, aktivieren oder deaktivieren die Attribute ifund unlessnur das Ziel, an das sie angehängt sind, dh die Abhängigkeiten des Ziels werden immer ausgeführt. Andernfalls würde es nicht funktionieren, von einem Ziel abhängig zu sein, das die Eigenschaft festlegt, nach der Sie suchen.
sschuberth
Es sieht aus wie <Available>veraltet. Ich habe dies verwendet: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> check: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: Wo steht, dass <available>es veraltet ist? 2: ${file::existst...} scheint nicht mit Ant zu arbeiten (Apache ANT 1.9.7)
user85421
123

Dies könnte aus Codierungssicht etwas sinnvoller sein (verfügbar mit ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
Adam
quelle
36
Dies ist meiner Meinung nach nur in Ant-Contrib verfügbar.
Richard Cook
26

Seit Ant 1.8.0 gibt es anscheinend auch Ressourcen

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

Testet eine Ressource auf Existenz. seit Ant 1.8.0

Die tatsächlich zu testende Ressource wird als verschachteltes Element angegeben.

Ein Beispiel:

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

Ich wollte das Beispiel aus der obigen guten Antwort auf diese Frage überarbeiten und fand es dann

Ab Ant 1.8.0 können Sie stattdessen die Eigenschaftserweiterung verwenden. Ein Wert von true (oder on oder yes) aktiviert das Element, während false (oder off oder no) es deaktiviert. Andere Werte werden weiterhin als Eigenschaftsnamen angenommen. Daher ist das Element nur aktiviert, wenn die benannte Eigenschaft definiert ist.

Im Vergleich zum älteren Stil bietet dies zusätzliche Flexibilität, da Sie die Bedingung über die Befehlszeile oder übergeordnete Skripte überschreiben können:

<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"/>

aus dem Ameisenhandbuch unter http://ant.apache.org/manual/properties.html#if+unless

Hoffentlich ist dieses Beispiel für einige von Nutzen. Sie verwenden keine Ressourcen, aber vermutlich könnten Sie? .....

Jon Stafford
quelle
2
Beachten Sie, dass if="${file.exists}"dies durch if="file.exists"as ersetzt werden sollte, ifund unlessüberprüfen Sie nur das Vorhandensein einer Eigenschaft anhand des Namens, nicht den Wert.
Vadzim
1
@Vadzim Wie in der Antwort erwähnt, funktioniert dies nur in Ant 1.8, und 1.8 unterstützt die Erweiterung von Eigenschaften. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky
12

Ich denke, es lohnt sich, auf diese ähnliche Antwort zu verweisen: https://stackoverflow.com/a/5288804/64313

Hier ist eine weitere schnelle Lösung. Mit dem <available>Tag sind weitere Variationen möglich :

# 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>
cmcginty
quelle
3

Aktivieren Sie die Option Dateinamenfilter verwenden wie DB_*/**/*.sql

Hier ist eine Variante zum Ausführen einer Aktion, wenn eine oder mehrere Dateien vorhanden sind, die einem Platzhalterfilter entsprechen. Das heißt, Sie kennen den genauen Namen der Datei nicht.

Hier suchen wir rekursiv nach " * .sql " -Dateien in Unterverzeichnissen mit dem Namen " DB_ * ". Sie können den Filter an Ihre Bedürfnisse anpassen.

NB: Apache Ant 1.7 und höher!

Hier ist das Ziel, um eine Eigenschaft festzulegen, wenn übereinstimmende Dateien vorhanden sind:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

Hier ist ein "bedingtes" Ziel, das nur ausgeführt wird, wenn Dateien vorhanden sind:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
David Robson
quelle
0

Sie können dies tun, indem Sie den Vorgang mit einer Liste von Dateien mit Namen ausführen, die den Namen entsprechen, die Sie benötigen. Es ist viel einfacher und direkter als ein spezielles Ziel zu erstellen. Und Sie brauchen keine zusätzlichen Werkzeuge, nur reine Ameise.

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

Siehe: FileSet .

Gangnus
quelle