2

次のようなことをする必要があるとしましょう:

<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
    <fileset dir="dir1" />
    <fileset dir="dir2" />
    <fileset dir="dir3" />
    ...
    <if>
        <equals arg1="${SPECIAL_BUILD}" arg2="true"/>
        <then>
            <fileset dir="dir7" />
            <fileset dir="dir8" />
            ...
        </then>
    </if>
</copy>

(実際のタスクはコピーではありません。要点を説明するために使用しているだけです。)

<if>Ant は、私のタスクが十分に公正な入れ子をサポートしていないと不平を言うでしょう。私はこれらの線に沿って考えてきました:

次のような「要素」属性を持つマクロ定義を追加できます。

<macrodef name="myCopy">
    <element name="additional-path" />
    <sequential>
        <copy todir="${DEPLOYMENT_DIR}" overwrite="true">
            <fileset dir="dir1" />
            <fileset dir="dir2" />
            <fileset dir="dir3" />
            ...

            <additional-path/>
        </copy>
    </sequential>
</macrodef>

しかし、それは、呼び出し元 (ターゲット) が回避したい追加のパスを指定する必要があることを意味します (多くのターゲットがこのタスクを呼び出す場合、additional-path要素内のファイルセット定義を繰り返す必要があります)。

Ant が文句を言わないように、マクロ定義に追加のファイルセットをコーディングする方法は?

4

2 に答える 2

1

AntContribには、 if条件とnot条件で拡張された Ant FileSetオブジェクトあります。

http://ant-contrib.sourceforge.net/fileset.html

if「if」条件のプロパティ名を設定します。プロパティが定義されていない限り、ファイルセットは無視されます。プロパティの値は重要ではありませんが、誤った解釈を意味する値 ("false"、"no") は、評価時に例外をスローします。

「 unless 」条件のプロパティ名を設定します。名前付きプロパティが設定されている場合、ファイルセットは無視されます。プロパティの値は重要ではありませんが、動作の誤解 ("false"、"no") を意味する値は、評価時に例外をスローします。

次のように使用できます。

<copy todir="${DEPLOYMENT_DIR}" overwrite="true">
    <fileset dir="dir1" />
    <fileset dir="dir2" />
    <fileset dir="dir3" />
    ...
    <fileset dir="dir7" if="SPECIAL_BUILD" />
    <fileset dir="dir8" if="SPECIAL_BUILD" />

</copy>
于 2010-10-21T23:50:45.640 に答える
1

これを実現する 1 つの方法 (良い方法かどうかはわかりません) は、2 つのマクロ定義を作成することです。1 つは一般的な使用のための「パブリック」マクロであり、もう 1 つは実際の作業を行い、「パブリック」マクロからのみ呼び出されることを意図した「内部」マクロです。このような:

<macrodef name="task-for-public-use">
    <sequential>
        <if>
            <equal arg1="${SPECIAL_BUILD}" arg2="true" />
            <then>
                <internal-task>
                    <additional-path>
                        ...
                    </additional-path>
                </internal-task>
            </then>
            <else>
                <internal-task ... />
            </else>
        </if>
    </sequential>
</macrodef>


<macrodef name="internal-task">
    <element name="additional-path" />
    <sequential>
        <copy ...>
            ...
            <additional-path/>
        </copy>
    </sequential>
</macrodef>

私はそれがあまり好きではありませんが、より良い方法があることを願っています。

于 2010-10-22T13:38:31.200 に答える