web-dev-qa-db-ja.com

Ant(1.6.5)-1つの<condition>または<if>に2つのプロパティを設定する方法

Antの2つのブール値に依存する2つの異なる変数に2つの異なる文字列を割り当てようとしています。

擬似コード(ish):

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

私が試したのは;

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

しかし、「<if>」を含む行に対してnullポインタ例外が発生します。 <condition property=...>タグを使用して動作させることができますが、一度に設定できるプロパティは1つだけです。 <propertyset>を使ってみましたが、それも許可されませんでした。

あなたがおそらく推測しているように、私はアリに不慣れです:)。

Gav

13
gav

これを行うにはいくつかの方法があります。最も簡単なのは、2つのconditionステートメントを使用し、プロパティの不変性を利用することです。

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

これは少し面倒で、適切に拡張できませんが、2つのプロパティについては、おそらくこのアプローチを使用します。

やや良い方法は、条件付きターゲットを使用することです。

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

ここでも、プロパティの不変性を利用しています。これを行いたくない場合は、unless属性と、追加レベルの間接参照を使用できます。

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

ifunless属性とtarget属性は、プロパティの値ではなく、プロパティが設定されているかどうかのみを確認することに注意してください。

35
Jason Day

Ant-Contrib ライブラリを使用して、きちんとした<if><then><else>構文にアクセスできますが、いくつかのダウンロード/インストール手順。

この他のSO質問: ant-contrib --if/then/else task を参照してください

1
Frosty Z