0

プレフィックスに基づいて、一連の ant プロパティを「マップ」したいと思います (単純に聞こえます)。

解決策はありますが、エレガントではありません (プロパティ ファイルに書き込んでから読み戻す必要があります)。

質問: ANT 内で以下の "load-propertyset" を実行するための、より迅速な/より一般的な/単純な/すぐに使える/簡単な方法はありますか? (...以下に提供した例よりも)

( Groovy > ConfigSlurper > Special Environment Configurationの動作にほぼ類似しています。)

例えば:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Config">

    <!-- Section 1. (These will be loaded from a property file...) -->
    <property name="a.yyy" value="foo" />
    <property name="a.zzz" value="cat" />
    <property name="b.xxx" value="bar" />
    <property name="b.zzz" value="dog" />

    <macrodef name="load-propertyset">
        <attribute name="prefix" />
        <attribute name="outfile" default="123" />
        <attribute name="propset" default="123" />
        <sequential>
            <propertyset id="@{propset}">
                <propertyref prefix="@{prefix}" />
                <globmapper from="@{prefix}.*" to="*" />
            </propertyset>
            <echo level="debug">Created propertyset - '@{propset}' from prefix='@{prefix}'</echo>
            <tempfile property="@{outfile}" suffix=".properties" deleteonexit="true" />
            <echo level="debug">Writing propset to temp file - '${@{outfile}}'</echo>
            <echoproperties destfile="${@{outfile}}">
                    <propertyset refid="@{propset}"/>
            </echoproperties>
            <echo level="debug">Reading props from temp file - '${@{outfile}}'</echo>
            <property file="${@{outfile}}" />
            <delete file="${@{outfile}}" />
        </sequential>
    </macrodef>

    <load-propertyset prefix="a" />
    <load-propertyset prefix="b" />

    <echo>>>> Using variables xxx=${xxx} yyy=${yyy} zzz=${zzz}</echo>

</project>

たとえば、次のような単純なものが欠けていると確信しています。

  • プロパティセット内のプロパティを参照できますか? (例: ${myprops.yyy} ?)
  • ${${filter}.hostname} のようなものは避けたいと思います。
4

1 に答える 1

0

サードパーティのAnt-Contribには、<antcallback>タスクを受け取り、呼び出し元にプロパティを返す機能を追加する<antcall>タスクがあります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Config" default="run">
    <taskdef resource="net/sf/antcontrib/antlib.xml" />

    <!-- Section 1. (These will be loaded from a property file...) -->
    <property name="a.yyy" value="foo" />
    <property name="a.zzz" value="cat" />
    <property name="b.xxx" value="bar" />
    <property name="b.zzz" value="dog" />

    <macrodef name="load-propertyset">
        <attribute name="prefix" />
        <attribute name="return" />
        <sequential>
            <antcallback target="-empty-target" return="@{return}">
                <propertyset>
                    <propertyref prefix="@{prefix}" />
                    <globmapper from="@{prefix}.*" to="*" />
                </propertyset>
            </antcallback>
        </sequential>
    </macrodef>

    <target name="-empty-target"/>

    <target name="run">
        <property name="properties-to-return" value="xxx,yyy,zzz"/>
        <load-propertyset prefix="a" return="${properties-to-return}"/>
        <load-propertyset prefix="b" return="${properties-to-return}"/>

        <echo>>>> Using variables xxx=${xxx} yyy=${yyy} zzz=${zzz}</echo>
    </target>
</project>

properties-to-returnコンセプトは、メンテナンスの負担が少しあります。幸いなことに、<antcallback>設定されていないプロパティを返すように求められても失敗しません。properties-to-return新しいマップされたプロパティが必要な場合は、プロパティのみを変更する必要があります。

于 2013-09-06T16:03:48.220 に答える