私はantを使用していますが、if/then/elseタスク(ant-contrib-1.0b3.jar)に問題があります。以下のbuild.xmlで簡略化できるものを実行しています。
「ant -Dgiv = Luke」からメッセージを取得することを期待しています
input name: Luke
should be overwritten with John except for Mark: John
しかし、プロパティ「giv」はif/then/else内では上書きされないようです。
input name: Luke
should be overwritten with John except for Mark: Luke
私が${giv}
でequalsタスクを使用しているという事実に依存していますか?そうでなければ、私のコードの何が問題になっていますか?
build.xmlコード:
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<property name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
Antプロパティを上書きするのは非常に困難です(不可能ではないにしても)。必要なのは 変数 です。これらはAnt Contrib JARでも定義されています。
あなたの例を編集する:
<target name="ifthen">
<var name="Evangelist" value="${giv}" />
<echo message="input name: ${Evangelist}" />
<if>
<equals arg1="${Evangelist}" arg2="Mark" />
<then>
</then>
<else>
<var name="Evangelist" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${Evangelist}" />
</target>
Antでは、プロパティは常に1回設定され、その後、その変数は変更できなくなります。
以下に、標準のAnt(ant-contrib
なし)を使用したソリューションを示します。これは、追加の依存関係を必要としない人に役立ちます。
<target name="test" >
<echo message="input name: ${param}" />
<condition property="cond" >
<equals arg1="${param}" arg2="Mark" />
</condition>
</target>
<target name="init" depends="test" if="cond">
<property name="param2" value="Mark" />
</target>
<target name="finalize" depends="init">
<property name="param2" value="John" />
<echo message="should be overwritten with John except for Mark: ${param2}" />
</target>
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<var name="giv" unset="true"/>
<property name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
var
タスクを使用して、プロパティの設定を解除することもできます。
私はこれが古いことを知っていますが、解決策を探している他の人にとって便利なはずです。
ant-contribを使用せずにプロパティを再割り当てするには、スクリプトでmacrodefを使用します。
<macrodef name="property-change">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<script language="javascript"><![CDATA[
project.setProperty("@{name}", "@{value}");
]]></script>
</sequential>
</macrodef>
次に、antの任意の場所で、プロパティタグのようにこれを呼び出します。
<property-change name="giv" value="John"/>
これを元のバージョンのxmlに実装すると、次のようになります。
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<property-change name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
このサンプルは、ant-contribの<var>コマンドを置き換えるマクロを記述する例としてのみ提供されています。 <if>コマンドが使用されているこのような状況では、ant-contribがすでにロードされているため、<var>を使用する方が理にかなっており、<var>の方が処理が高速になる可能性があります。
お役に立てれば。