"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 创建执行矩阵的能力) .
我想重写导入的 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 创建执行矩阵的能力) .