12

別のファイルに小さなマクロ定義を書きました:

マクロ定義.xml

<macrodef name="do-cool-stuff">
  <attribute name="message"/>

  <sequential>
    <echo message="@{message}" />
  </sequential>
</macrodef>

メインのビルド ファイルである 2 番目のファイルを取得しました。

build.xml

<target name="build">
  <!-- do this and that -->

  <!-- cheking out macrodefs.xml via CVS -->

  <ant antfile="macrodefs.xml" target="do-cool-stuff" >
    <property name="message" value="Hello, World!" />
  </ant>
</target>

ご想像のとおり、これは機能しません。エラー メッセージは次のようなものです。

Target 'do-cool-stuff' does not exist in this project.

私が見つけた唯一の可能な解決策は、ant 呼び出しを転送するために、macrodefs.xml に追加のターゲットを提供することです。

別のファイル内からマクロ定義を呼び出す可能性はありますか?

前もって感謝します。

4

1 に答える 1

19

importファイルを次のように使用してマクロを使用できます。

<import file="macrodefs.xml" />
<do-cool-stuff message="Hello, World!" />

マクロ定義では、@{curlybrackets}マクロ属性を参照するときに使用する必要があることに注意してください。

<sequential>
    <echo message="@{message}" />
</sequential>

macrodefAntタスクドキュメントの最後にいくつかの例があります。

もっと

あなたがやろうとしていることは、Ant によって十分にサポートされていません。およびタスクantantcallは、「呼び出し先」が呼び出し元に直接影響を与えることはできません。呼び出されたタスクにファイルを書き込んでから、それらを呼び出し元にロードできます。しかし、ご覧のとおり、前処理タスクimportincludeターゲット内から呼び出すことはできません。ant/antcall タスクでは、マクロではなく、補助ビルドでのみターゲットを実行できます。

1 つの回避策 (これはあなたが言及したものと似ているかもしれませんが、すべての実際の作業を最上位ビルドに入れることができます) は、macrodefs.xml の最上位インポートを含む内部ビルドファイルを持つことです。

次のようなもの。macrodefs.xml ファイルは以前と同じです。(ただし、インポートされたファイル (マクロ定義を含む) は完全な Ant プロジェクト ファイルである必要があるため、プロジェクト要素を含める必要があることに注意してください。)

build.xml:

<target name="build">
    <!-- cvs actions -->
    <ant antfile="inner-build.xml" target="target-runner">
        <property name="target" value="top-target" />
    </ant>
</target>

<!-- this target will fail unless invoked from the inner build -->
<target name="top-target">
    <do-cool-stuff message="Hello, World!" />
</target>

内部ビルド.xml:

<project>
    <import file="macrodefs.xml" />

    <target name="target-runner">
        <ant antfile="build.xml" target="${target}" />
    </target>
</project>

効果的にあなたはやっているでしょう

build.xml --> inner-build.xml --> build.xml (again)
(cvs)         (import macros)     (use macros)

複数のマクロ定義ファイルをインポートしたい場合など、内部ビルドファイルはメインビルドによってオンザフライで生成される可能性がありますが、おそらく扱いにくくなっています。

于 2011-02-18T17:08:26.133 に答える