13

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

equals タスクを使用しているという事実に依存してい${giv}ますか? それ以外の場合、私のコードの何が問題になっていますか?

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

5 に答える 5

34

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>
于 2011-02-25T15:05:03.107 に答える
17

Ant プロパティを上書きするのは非常に困難です (不可能ではないにしても)。必要なのはVariableです。これらは、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>
于 2011-02-25T14:13:37.053 に答える
2

私はこれが古いことを知っていますが、解決策を探している他の人にとって便利であることを証明する必要があります.

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> を使用する方が理にかなっています。

お役に立てれば。

于 2012-11-27T18:04:54.997 に答える
2
<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>

vartask を使用してプロパティの設定を解除することもできます。

于 2011-12-27T10:01:13.680 に答える
-1

ant-contrib 'propertycopy' を使用して、プロパティの値を再割り当てすることができます。これは、ant-contrib 変数を使用する代わりの方法です。このようにして、プロパティ「giv」を上書きできます。

<target name="ifthen">
  <echo message="input name: ${giv}" />
  <if>
    <equals arg1="${giv}" arg2="Mark" />
    <then>
    </then>
    <else>
      <property name="tempName" value="John" />
      <propertycopy name="giv" from="tempName" override="true" />
    </else>
  </if>
  <echo message="should be overwritten with John except for Mark: ${giv}" />
</target>

これは、プロパティ tempName がまだ「John」以外の値に設定されていないことを前提としていることに注意してください。

于 2013-01-31T02:30:19.917 に答える