Frage

Ich versuche, zwei verschiedene Strings zu zwei verschiedenen Variablen zuweisen abhängig von zwei booleans in Ant.

Pseudocode (ish):

if(condition)
   if(property1 == null)
      property2 = string1;
      property3 = string2;
   else
      property2 = string2;
      property3 = string1;

Was habe ich versucht, ist;

<if>
  <and>
    <not><isset property="property1"/></not>
    <istrue value="${condition}" />
  </and>
  <then>
    <property name="property2" value="string1" />
    <property name="property3" value="string2" />
  </then>
  <else>
    <property name="property2" value="string2" />
    <property name="property3" value="string1" />
  </else>
</if>

Aber ich bekomme eine Null-Zeiger Ausnahme für die Zeile mit „<if>“. Ich kann es an der Arbeit <condition property=...>-Tags verwenden, aber nur eine Eigenschaft zu einer Zeit festlegen. Ich habe versucht, <propertyset> verwenden, aber das war auch nicht erlaubt.

Ich bin neu in Ameise wie Sie wahrscheinlich erraten haben.)

Gav

War es hilfreich?

Lösung

Es gibt mehrere Möglichkeiten, dies zu tun. Die einfachste ist, nur zwei condition Anweisungen zu verwenden, und nutzen Sie Eigenschaft Unveränderlichkeit:

<condition property="property2" value="string1">
    <isset property="property1"/>
</condition>
<condition property="property3" value="string2">
    <isset property="property1"/>
</condition>

<!-- Properties in ant are immutable, so the following assignments will only
     take place if property1 is *not* set. -->
<property name="property2" value="string2"/>
<property name="property3" value="string1"/>

Das ist ein bisschen umständlich und skaliert nicht gut, aber nur für zwei Eigenschaften würde ich wahrscheinlich diesen Ansatz verwenden.

Ein etwas besserer Weg ist ein bedingtes Ziel zu verwenden:

<target name="setProps" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="init" depends="setProps">
    <!-- Properties in ant are immutable, so the following assignments will only
         take place if property1 is *not* set. -->
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>

    <!-- Other init code -->
</target>

Wir nehmen wieder die Vorteile von Immobilien Unveränderlichkeit hier. Wenn Sie möchten, das nicht tun, können Sie das unless Attribut verwenden, und ein extra Dereferenzierungsebene:

<target name="-set-props-if-set" if="property1">
    <property name="property2" value="string1"/>
    <property name="property3" value="string2"/>
</target>

<target name="-set-props-if-not-set" unless="property1">
    <property name="property2" value="string2"/>
    <property name="property3" value="string1"/>
</target>

<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/>

<target name="init" depends="setProps">
    <!-- Other init code -->
</target>

Es ist wichtig zu beachten, dass die if und unless Attribute target nur prüfen, ob die Eigenschaft gesetzt ist, nicht den Wert der Immobilie.

Andere Tipps

Sie können mit Ant-Contrib Bibliothek Zugang zu müssen eine ordentliche <if><then><else> Syntax, aber es wird ein paar Downloads benötigen / Schritte installieren.

Sehen Sie diese anderen SO Frage: ant-contrib - if / then / else Aufgabe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top