0

単純な ant のプロパティを操作するのは難しく、必要な値を簡単に設定することはできません (プロパティは不変です)。ant-conrib の var タスクを使用すると、プロパティを設定および設定解除できます。

このような複雑な方法で動作するように設計された ant プロパティを作成する背後にある真の理由または正当な理由はありますか?.

<property name="some.ant.prop" value=""/>

        <if>
            <isset property="some.ant.prop"/>
            <then>
                <echo message="immutable ant prop - not good, defined and just even set to null string : ${some.ant.prop}"/>

                <property name="some.ant.prop" value="no-effect-value"/>
                <echo message="no-effect on changing already defined prop : ${some.ant.prop}"/>

                <var name="some.ant.prop" unset="true"/>
                <property name="some.ant.prop" value="any-value-accepted"/>
                <echo message="Overwritten prop value: ${some.ant.prop}"/>

            </then>
        </if>

議論や議論のためではありませんが、より実現可能な代替案について知っておくとよいでしょう。ありがとう。

4

1 に答える 1

3

Ant はプログラミング言語ではありません。
一度設定されたプロパティは、設計上、ant では不変です。
長所と短所については (あまりにも) 頻繁に議論されてきたので、詳細には触れません。

これらの制限を克服するためのいくつかの可能性:
過去には、その目的のために antcall が使用されていました。すべての欠点があるため、「antcall vs. macrodef」を検索して詳細を取得してください。Ant 1.6 が導入されmacrodef、Ant 1.8 には新しいlocalタスクが追加されました。
マクロ定義とローカルでは不十分な場合は、組み込みの JavaScript エンジン (JDK 1.6 以降) またはGroovyでスクリプト タスクを使用して、 ant api にアクセスできます。fe antcontrib やFlaka

などの Ant アドオンもあります。antcontrib var / unset が不器用すぎると感じたら、Flaka のlettask は、プロパティを上書きするためのより直接的なアプローチを提供します。

<!-- set a new property -->
<fl:let>foo := 'bar'</fl:let>

<!-- overwrite an existing property or userproperty
     (those properties defined on the commandline via -Dfoo=bar ..)
     notice the double '::' in foo ::= 'baz' -->
<fl:let>foo ::= 'baz'</fl:let>

最後に:
ant とその制限に慣れるか (ただし、antcall は使用しないでください! )、
Ant アドオン
を使用するか、groovy の ant を使用するか、 Gradle
に切り替えます。

于 2013-11-07T21:41:14.717 に答える