我想覆盖导入的Ant-File的一些属性,这些属性处理部署应用程序的大部分基本内容。首先,我知道Ant中的属性是不可变的。但我可以想到两种方法来“覆盖”我的需求属性,我想知道,哪一个应该是首选方法,和/或是否有任何事情要考虑通过这样或那样做。
想象一下,我们有以下 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 over include,因为我也想覆盖一些目标。我知道有两种可能的解决方案来覆盖它们:
1)由于属性是不可变的,我可以通过在实际导入主文件之前定义它们来定义属性我想“覆盖”:
<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
有人会这么善良,可以解释我的差异,也可以解释为什么我应该使用一种方式而不是另一种方式,或者甚至应该使用不同的方法来获得相同的结果?
答案 0 :(得分:1)
第一个和第二个示例之间的主要区别在于,在第二种情况下,属性仅为子构建定义,有时可能是您想要的,而不是全局构建。
您可以在全球范围内预先定义属性的其他方式...
执行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/>
与您提供的示例相比,这两种方法的优点是可以在不更改构建文件的情况下覆盖属性。
答案 1 :(得分:1)
Ant版本1.8及更高版本附带<local/>
任务,允许您将属性声明为本地属性。这可能就是你所需要的。
另一种选择是使用<macrodef>
,它允许您定义自己的宏(这比使用<antcall>
更好,因为<antcall>
可以破坏Ant创建执行的能力矩阵)。