5

我有一组构建文件,其中一些调用其他文件——首先导入它们。行尾构建可能有也可能没有特定目标(例如“copyother”)。如果该目标是在行尾构建脚本中定义的,我想从我的主构建文件中调用它。我该怎么做?

部分调用脚本:

<!-- Import project-specific libraries and classpath -->
<property name="build.dir" value="${projectDir}/build"/>
<import file="${build.dir}/build_libs.xml"/>

...

<!-- "copyother" is a foreign target, imported in build_libs.xml per project -->
<target name="pre-package" depends="    clean,
                                        init,
                                        compile-src,
                                        copy-src-resources,
                                        copy-app-resources,
                                        copyother,
                                        compile-tests,
                                        run-junit-tests"/>

我不希望每个项目都定义“copyother”目标。如何进行有条件的蚂蚁调用?

4

3 回答 3

3

我猜您没有将“其他”构建脚本导入您的主 bu​​ild.xml。(因为那行不通。Ant 将进口视为本地进口。)

同时,您使用的是依赖而不是 ant/ant 调用,因此您可能正在导入它们,但一次导入一个。

你不能在原生 Ant 中做你想做的事。正如您所指出的,对文件进行测试很容易,但目标却不是。特别是如果尚未加载其他项目。您肯定必须编写自定义 Ant 任务来完成您想要的。两种途径:

1) 调用 project.getTargets() 并查看您的目标是否存在。这涉及重构您的脚本以使用 ant/antcall 而不是纯依赖,但感觉不像是 hack。编写自定义 Java 条件并不难,Ant 手册中有一个示例。

2) 将目标添加到当前项目(如果还没有的话)。新目标将是无操作的。[不确定这种方法是否有效]

于 2011-05-27T03:08:11.053 回答
1

为了完整性。另一种方法是有一些目标来检查目标。

该方法在这里讨论:http ://ant.1045680.n5.nabble.com/Checking-if-a-Target-Exists-td4960861.html(vimil的帖子)。使用 scriptdef 完成检查。所以它与其他答案(Jeanne Boyarsky)没有什么不同,但脚本很容易添加。

<scriptdef name="hastarget" language="javascript">
    <attribute name="targetname"/>
    <attribute name="property"/>
    <![CDATA[
       var targetname = attributes.get("property");
       if(project.getTargets().containsKey(targetname)) {
            project.setProperty(attributes.get("property"), "true");
       }
     ]]>
</scriptdef>

<target name="check-and-call-exports">
    <hastarget targetname="exports" property="is-export-defined"/>
    <if>
        <isset property="is-export-defined"/>
        <then>
            <antcall target="exports"   if="is-export-defined"/>
        </then>
    </if>
</target>

<target name="target-that-may-run-exports-if-available" depends="check-and-call-exports">
于 2013-12-02T10:48:09.113 回答
0

您应该探索typefound在 1.7 中添加到 ANT 的条件的使用。例如,您可以将它与 antcontrib 中的 if 任务一起使用,但由于它的工作方式,您必须检查宏定义而不是任务定义:

<if>
   <typefound name="some-macrodef"/>
<then>
   <some-macrodef/>
   </then>
</if>

这样,具有名为“some-macro-or-taskdef”的宏定义的 ant 文件将被调用,而没有它的其他 ant 文件将不会出错。

于 2011-07-29T02:37:01.840 回答