"Override" 导入的 Ant 文件的属性

"Override" properties of an imported Ant file

我想重写导入的 Ant-File 的一些属性,它处理部署应用程序的大部分基本内容。首先我知道 Ant 中的属性是不可变的。但是我可以想出两种 "override" 属性的方法来满足我的需要,我想知道哪一种应该是首选方法,and/or 如果有任何事情需要考虑通过一种方式进行或者另一个。

假设我们有以下 master-build-script,我想将其导入到我的构建脚本中:

<project name="Application" default="build" basedir=".">

    <property name="overridden" value="false" />

    <target name="build">
        <echo message="Value of overridden is ${overridden}" /> 
    </target>
</project>

现在我想覆盖 覆盖 属性。在这两种情况下,我都导入 master-build-file。我使用 import 而不是 include,因为我还想覆盖一些目标。我知道有两种可能的解决方案来覆盖它们:

1) 由于属性是不可变的,因此我可以在实际导入主文件之前定义我想要 "override" 的属性:

<project name="MyApplication" default="buildApplication" basedir=".">

    <property name="overridden" value="true" />

    <import file="master-build.xml" />

    <target name="buildApplication">
        <antcall target="build" />
    </target>
</project>

2) 我在 Ant 调用中定义了 Params,它似乎也重新定义了一个属性值:

<project name="MyApplication" default="buildApplication" basedir=".">

    <import file="master-build.xml" />

    <target name="buildApplication">
        <antcall target="build" >
            <param name="overridden" value="true"/>
        </antcall>
    </target>
</project>

在这两种情况下,结果都是:

build:
     [echo] Value of overridden is true
BUILD SUCCESSFUL

有没有人能解释一下其中的区别,也可以解释为什么我应该使用一种方法而不是另一种方法,甚至应该使用不同的方法来获得相同的结果?

您的第一个示例和第二个示例之间的主要区别在于,在第二种情况下,属性 仅针对子构建定义,这有时可能是您想要的,而不是针对构建全局定义的。

您可以在全局范围内预先定义属性的其他方法...

当你执行ant时作为JVM args传递,例如

ant -Doverridden=true

在文件中定义属性并在构建开始时加载,例如

build.properties:

overridden=true

build.xml:

<project name="MyApplication" default="buildApplication" basedir=".">

<property file="build.properties/>

一个有用的变体是从用户主目录加载用户可定义的属性,例如类似于:

<property file="${user.home}/MyApplication/build.properties/>

与您提供的示例相比,这两种方法的优势在于无需更改构建文件即可覆盖属性。

Ant 版本 1.8 及更高版本附带 <local/> 任务,它允许您将 属性 声明为本地。这可能就是您所需要的。

另一种选择是使用 <macrodef>,它允许您定义自己的宏(这比使用 <antcall> 更好,因为 <antcall> 可以破坏 Ant 创建执行矩阵的能力) .