So legen Sie eine Ant-Eigenschaft nur fest, wenn sie nicht festgelegt ist


72

Ich kann nicht herausfinden, wie eine Ant-Eigenschaft unter der Bedingung festgelegt wird, dass sie nicht festgelegt wurde (dh sie ist nicht in der Eigenschaftendatei definiert und sollte automatisch als Standard festgelegt werden).

Bisher habe ich nur folgenden Code:

<condition property="core.bin" value="../bin">
    <isset property="core.bin"/>
</condition>

Dies scheint jedoch nur zu funktionieren, wenn der Wert in einem <property>Tag definiert ist .

Weiß jemand, wie man eine Eigenschaft zum ersten Mal bedingt festlegt, wenn sie derzeit nicht festgelegt ist?

Antworten:


116

Sie können die Eigenschaft einfach mit der Eigenschaftsaufgabe festlegen. Wenn die Eigenschaft bereits festgelegt ist, bleibt der Wert unverändert, da die Eigenschaften unveränderlich sind.

Sie können aber auch "nicht" in Ihren Zustand aufnehmen:

<condition property="core.bin" value="../bin">
   <not>  
      <isset property="core.bin"/>
   </not>
</condition>

64

Ant macht dies standardmäßig; wenn die Eigenschaft bereits festgelegt ist; Ein erneutes Einstellen hat keine Auswirkung:

<project name="demo" default="demo">
    <target name="demo" >
        <property name="aProperty" value="foo" />
        <property name="aProperty" value="bar" /> <!-- already defined; no effect -->
        <echo message="Property value is '${aProperty}'" /> <!-- Displays 'foo' -->
    </target>
</project>

Gibt

   /c/scratch> ant -f build.xml
Buildfile: build.xml

demo:
     [echo] Property value is '${aProperty}'

BUILD SUCCESSFUL
Total time: 0 seconds
/c/scratch> ant -f build.xml
Buildfile: build.xml

demo:
     [echo] Property value is 'foo'

BUILD SUCCESSFUL

Eigenschaften können nicht neu definiert werden. Dazu müssen Sie so etwas wie die variable Aufgabe von ant-contrib verwenden .


Das ist nicht wahr. Das erste Echo im folgenden Beispiel gibt "Ha1" und das zweite Echo "Ha2" aus: <if test = "$ {deploy.env == 'PROD'}"> <property name = "deploy.root.dir "value =" Ha1 "/> <echo message =" Setzen von deploy.root.dir auf: $ {deploy.root.dir} "/> </ if> <property name =" deploy.root.dir "value =" Ha2 "/> <echo message =" Setzen von deploy.root.dir auf: $ {deploy.root.dir} "/>
Denis

2
Ich denke du liegst falsch. Dies ist in der Ant-Dokumentation sehr deutlich. Ich konnte Ihr Beispiel nicht ausführen (wo ist die If-Aufgabe definiert? Sieht nicht nach der Syntax von ant-contribs aus), aber <project> <property name = "p" value = "1" /> <property name = ausführen "p" value = "2" /> <echo message = "$ {p}" /> </ project> gibt den ersten Wert 1 an. Dies ist möglich, indem benutzerdefinierte Aufgaben geschrieben werden, jedoch nur durch Ändern der Ants Projektmodell direkt.
Andy Lynch

6

Der einfachste Weg, um das zu tun, was Sie wollen:

<if>
    <not>
        <isset property="your.property"/>
    </not>
    <then>
        <property name="your.property" value="your.value"/>
    </then>
</if>

4

Es gibt Unterstützung für die Verwendung von "else" in: https://ant.apache.org/manual/Tasks/condition.html , um Ihren genauen Zweck zu erfüllen.

sonst

The value to set the property to if the condition evaluates to false. By default the property will remain unset. Since Apache Ant 1.6.3

Wechseln Sie also zu:

<condition property="core.bin" else="../bin">
    <isset property="core.bin"/>
</condition>

2

Eigenschaften in Ant sind unveränderlich. Nach der Definition können sie nicht mehr geändert werden.

Das Ant Contrib- Paket bietet jedoch die variableAufgabe. Es funktioniert wie eine Eigenschaft, aber die Werte können geändert und deaktiviert werden. Beispiel aus der Dokumentation zu variablen Aufgaben :

    <var name="x" value="6"/>
    <if>
        <equals arg1="${x}" arg2="6" />
        <then>
            <var name="x" value="12"/>
        </then>
    </if>
    <echo>${x}</echo>   <!-- will print 12 -->
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.