【问题标题】:How to invoke a macrodef from within another file如何从另一个文件中调用宏定义
【发布时间】:2011-02-18 16:38:16
【问题描述】:

我在单独的文件中写了一个小宏定义:

ma​​crodefs.xml

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

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

我有第二个文件,我的主要构建文件:

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.

我找到的唯一可能的解决方案是在 macrodefs.xml 中提供一个额外的目标来转发 ant 调用。

是否有可能从另一个文件中调用宏定义?

提前致谢。

【问题讨论】:

    标签: ant build macrodef


    【解决方案1】:

    您可以import 文件并像这样使用宏:

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

    请注意,在宏定义中引用宏属性时应使用@{curlybrackets}

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

    在 Ant macrodef task 文档的末尾有一些示例。

    更多

    Ant 不太支持您尝试做的事情。 antantcall 任务不允许“被调用者”直接影响调用者。您可以在被调用任务中写入文件,然后在调用者中加载这些文件。但正如您所观察到的,预处理任务importinclude 不能从目标中调用。 ant/antcall 任务仅允许您在辅助构建中运行目标,而不是宏。

    一种解决方法(这可能与您提到的类似,但允许您将所有实际工作放在顶层构建中)是拥有一个包含宏定义的顶层导入的内部构建文件.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)
    

    内部构建文件可能由主构建动态生成 - 例如,如果您想导入多个宏定义文件 - 但这可能太笨拙了。

    【讨论】:

    • 嗨,谢谢。问题是导入是不可能的,因为我在目标执行时检查了定义的 xml 文件。
    • @scheffield - 我添加了更多想法。可能没有您想要的那么多帮助 - 希望它们有用。
    • 嗨,没关系。它回答了我是否可以从另一个 ant 文件中调用宏定义的问题。你的想法很酷...... gradle 比 ant 好得多的另一个原因。
    • @martinclayton 很好的答案,但缺少一件事。您的回答并没有说 imported XML 需要是一个完整的构建文件——_full_ 在某种意义上它必须有一个顶级 project 标记。在我弄清楚这一点之前,我试图导入一个 XML sn-p hours。我应该受到责备,因为我未能破译Unexpected element "{}macrodef" ... 错误消息,但仍然如此。如果您可以更新您的答案,那将是很好的,以便面临这个问题的新来者可以快速前进。 Here is some info on including snippets by the way..
    • @KohányiRóbert - 谢谢,非常好。我已经进行了编辑以包含它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2015-07-23
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多