4

私はプロパティでこの奇妙な振る舞いをしantています。あなたがどう思うか知りたいです。ロジックがわかりません。この動作は役立つ可能性がありますが、信頼できるかどうか、またはこれがバグであるかどうかを知りたいです。

目的の名前のプロパティがない場合、プロパティの右側を展開するときにantがプレフィックスを適用しているようです。SSCCEは次のとおりです。

build.properties:

a=A
formula=${a}

build.xml:

<project default="test">
    <target name="test">
        <property name="test.a" value="[test.a has been used instead of a, why? prefixValues is false]" />
        <property file="build.properties" prefix="test" prefixValues="false" />
        <echo>${test.formula}</echo>
    </target>
</project>

出力:

test:
    [echo] [test.a has been used instead of a, why? prefixValues is false]
BUILD SUCCESSFUL
Total time: 364 milliseconds

ご覧のとおり、test.formulaは「test.a」ではなく「a」を使用する必要がありますが、「a」は定義されていません。それが理由ですか?

4

4 に答える 4

1

確かに、それは奇妙に思えます。私の意見では、出力は${a}

いくつかのテストを行ったところ、次のことがわかりました。

abuild.xml代わりにbuild.properties:を定義すると、期待どおりに動作します。つまり、次のようになりますbuild.xml

<project default="test">
<target name="test">
    <property name="a" value="A" />
    <property file="build.properties" prefix="test" prefixValues="false" />
    <echo>${test.formula}</echo>
</target>
</project>

および build.properties

formula=${a}

出力は

A

しかし、出力に変更すると次prefixValues="true"のようになります。

${a}

私が期待していた間:${test.a}

最後に<property name="test.a" value="some value" />、build.xml で定義すると (常にprefixValues="true") : 出力は次のようになります (期待どおり)

some value

だから、私の結論:

  • prefixValues は、右側で使用されるプロパティが同じプロパティ ファイルで定義されていないとすぐに正常に機能します。

  • 右側で使用され、同じプロパティ ファイルで定義されているプロパティの prefixValues は無視されます。

于 2013-03-27T17:00:44.260 に答える
1

クラスのプロパティに関連するクラスで、Ant コードを見てみましょうorg.apache.tools.ant.property.ResolvePropertyMap

public void resolveAllProperties(Map<String, Object> map, String prefix,
                                     boolean prefixValues) {
        // The map, prefix and prefixValues flag get used in the
        // getProperty callback
        this.map = map;
        this.prefix = prefix;
        this.prefixValues = prefixValues;

        for (String key : map.keySet()) {
            expandingLHS = true;
            Object result = getProperty(key);
            String value = result == null ? "" : result.toString();
            map.put(key, value);
        }

次に、getProperty(String)メソッド (スニペット) で:

            // If the property we are looking up is a key in the map
            // (first call into this method from resolveAllProperties)
            // or we've been asked to prefix the value side (later
            // recursive calls via the GetProperty interface) the
            // prefix must be prepended when looking up the property
            // outside of the map.
            String fullKey = name;
            if (prefix != null && (expandingLHS || prefixValues)) {
                fullKey = prefix + name;
            }

ご覧のとおり、プロパティ ファイルにプロパティが存在する場合、それprefixValuesが false であってもプレフィックスを受け取ります。

于 2013-03-28T19:41:48.537 に答える
0

さらにテストを実行したところ、さまざまな結果が得られました。

ソースを確認したところ、ファイルを介してプロパティを追加するときにプロパティを探すときにバグがあると思います。Ant のソース コードをいくつか変更することで、動作させることができました。

最終的に、提案されたパッチをバグ レポート ( https://issues.apache.org/bugzilla/show_bug.cgi?id=54769 ) に記入することにしました。

皆さん、ありがとうございました。

于 2013-03-30T12:28:01.773 に答える
-1

これは、プロパティが不変であるためです。一度設定すると、ビルドの残りの部分でスタックします。 Ant マニュアルの「プロパティ」のドキュメントを確認してください。 一部の人々にとっては実際には一種の問題なので、ant-contrib の連中は変数を模倣する新しいタスクを含めました。

ビルドを次のように変更した場合:

<project default="test">
    <target name="test">
        <property file="build.properties" prefix="test" prefixValues="false" />
        <property name="test.a" value="[test.a has been used instead of a, why? prefixValues is false]" />
        <echo>${test.formula}</echo>
    </target>
</project>

コンソールに「A」が表示されます。これは、「test.a」への新しい(無視された)割り当ての前に、最初の呼び出しで test.a と test.formula が定義されたためです。

于 2013-03-25T18:52:59.203 に答える