我们在从 Eclipse 运行的 Ant 脚本中使用了很多属性。我想建立一个并行部署,它使用稍微不同的属性值构建项目,并部署到不同的位置......部署位置也是一个属性。
[如何] 我的新目标可以将某些属性更新为自定义测试值,然后运行普通目标以获得所需的结果?
简单的示例脚本非常受欢迎,我只知道足够的 Ant 来获得:)
我们在从 Eclipse 运行的 Ant 脚本中使用了很多属性。我想建立一个并行部署,它使用稍微不同的属性值构建项目,并部署到不同的位置......部署位置也是一个属性。
[如何] 我的新目标可以将某些属性更新为自定义测试值,然后运行普通目标以获得所需的结果?
简单的示例脚本非常受欢迎,我只知道足够的 Ant 来获得:)
您可以使用 antcall ( https://ant.apache.org/manual/Tasks/antcall.html ) 在被调用目标中使用参数覆盖属性,例如,考虑这个文件 example-antcall-properties.ant
<?xml version="1.0" encoding="UTF-8"?>
<project name="AntCall Properties and Params" default="first">
<property name="my.property" value="initial" />
<target name="first">
<echo message="main: my.property=${my.property}"/>
<antcall target="second" />
<antcall target="second">
<param name="my.property" value="changed"/>
</antcall>
<antcall target="second" />
</target>
<target name="second">
<echo message="second: my.property=${my.property}"/>
<antcall target="third" />
</target>
<target name="third">
<echo message="third: my.property=${my.property}"/>
</target>
</project>
看看结果
ant -f example-antcall-properties.ant
Buildfile: example-antcall-properties.ant
first:
[echo] main: my.property=initial
second:
[echo] second: my.property=initial
third:
[echo] third: my.property=initial
second:
[echo] second: my.property=changed
third:
[echo] third: my.property=changed
second:
[echo] second: my.property=initial
third:
[echo] third: my.property=initial
BUILD SUCCESSFUL
Total time: 0 seconds
请注意,属性的值在使用“param”的第二次目标“second”调用中发生了变化(并且更改传播到被调用目标内部调用的目标,在本例中为“third”),但在其他调用中没有(没有“参数”)。
但是,正如文档https://ant.apache.org/manual/Tasks/antcall.html中所报告的,
命令行上定义的属性不能被嵌套
<param>
元素覆盖。
通过此调用可以看出这一点:
ant -f example-antcall-properties.ant -Dmy.property="from command line"
Buildfile: example-antcall-properties.ant
first:
[echo] main: my.property=from command line
second:
[echo] second: my.property=from command line
third:
[echo] third: my.property=from command line
second:
[echo] second: my.property=from command line
third:
[echo] third: my.property=from command line
second:
[echo] second: my.property=from command line
third:
[echo] third: my.property=from command line
BUILD SUCCESSFUL
Total time: 0 seconds
<?xml version="1.0" encoding="UTF-8" ?>
<project default="all" basedir=".">
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<target name="all">
<property name="prop" value="1" />
<echo message="prop = ${prop}" />
<var name="prop" unset="true"/>
<property name="prop" value="2" />
<echo message="prop = ${prop}" />
</target>
</project>
覆盖属性可以通过将逻辑拆分为单独的文件来完成,这些文件可以作为基础包含,然后被覆盖。
例如,创建一个基本文件,base.xml
其中包含所有默认属性和目标:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<!-- Sets the default properties. Override in your main build file when needed. -->
<property name="admin.user" value="admin"/>
<property name="admin.pass" value="admin"/>
<target name="job1"/>
<target name="job2"/>
</project>
然后在主文件(例如build.xml
)中,覆盖属性,然后import
是基本文件:
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject">
<!-- Override properties -->
<property name="admin.user" value="root"/>
<property name="admin.pass" value="new_pass"/>
<!-- Import default properties -->
<import file="${basedir}/base.xml"/>
<!--<import><url url="https://example.com/base.xml"/></import>-->
<target name="job1">
<!-- Overriden job1 -->
</target>
<target name="job2">
<!-- Overriden job2 -->
</target>
</project>
GitHub 上的示例:National-Theatre/base-build-xml
.
对于并行执行,您可以使用parallel
task。