【问题标题】:Passing multiple targets to a subant将多个目标传递给子对象
【发布时间】:2013-12-21 20:02:25
【问题描述】:

我有一个使用 Ant 构建的 Android 项目,使用一些标准目标(调试、发布、安装、清理等)。我发现我可以使用如下命令运行多个目标:

ant clean debug

在这种情况下,它将在项目上运行“clean”,然后运行“debug”构建。这很好用。

我还有一个使用 Ant 构建的项目,我的第一个主项目依赖于它。我正在尝试在预构建步骤中自动构建子项目。到目前为止,我有这个:

<target name="-pre-build">        
    <subant target="${ant.project.invoked-targets}" failonerror="true">
        <fileset dir="../other_project" includes="build.xml" />
    </subant>

    <!-- (additional steps here) -->
</target>

这适用于一个目标(例如ant debug),但是当我运行多个目标(例如ant clean debug)时,我收到以下错误:

Target "clean,debug" does not exist in the project "com.foo.other_project"

当我真的想为每个目标重新运行 subant 时,显然invoked-targets 是一个逗号分隔的列表。有谁知道如何实现这一目标?有没有办法将目标列表传递给 subant,或者可能遍历列表并为每个目标运行一次 subant?

谢谢!

【问题讨论】:

    标签: android ant build


    【解决方案1】:

    documentation 描述了如何指定多个目标:

    您可以使用嵌套的“target”元素而不是使用“target”属性来指定多个目标。这些将按照指定的顺序执行,就像使用单个目标调用 Ant 一样,该目标的依赖关系是如此指定的目标。

    还提供了一个例子:

    <subant failonerror="false">
        <fileset dir="." includes="**/build.xml" excludes="build.xml"/>
        <target name="clean"/>
        <target name="build"/>
    </subant>
    

    【讨论】:

    • 感谢您的回复;这适用于硬编码值,但&lt;target name="${ant.project.invoked-targets}"/&gt; 仍然失败并出现相同的错误(目标“干净,调试”不存在)。有没有办法拆分逗号分隔的值并动态模拟多个&lt;target&gt; 节点?
    • @Alan 你误解了错误信息。您不能提交一个逗号分隔的列表作为目标的名称并期望它遍历该列表。这就是“subant”任务中的多个“target”元素允许您执行的操作。是的,可以使用 ant-contrib "for" 任务来遍历逗号分隔的列表,但这需要将额外的 jar 添加到您的项目中(不是标准 ANT 的一部分)。
    • 我仍然不清楚如何在不硬编码目标名称的情况下获取多个“目标”元素。 “clean,debug”只是一个例子,我希望它不管调用的目标如何都能工作。我听说 ant 是面向依赖的,因此认为问题是:master_project 中的任何目标(例如“clean”、“debug”、“foo”)都依赖于 other_project 中同名的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多