有没有办法重新分配 Antproperty
任务的值?或者是否有其他任务可用于此目的?
8 回答
ant-contrib 的 Variable
任务可以做到这一点:
<property name="x" value="6"/>
<echo>${x}</echo> <!-- will print 6 -->
<var name="x" unset="true"/>
<property name="x" value="12"/>
<echo>${x}</echo> <!-- will print 12 -->
但不推荐,如果您的 Ant 脚本的某些部分假设不可变的属性值,而其他部分打破了这个假设,它可能会导致奇怪的副作用。
为了公正起见,有一个 hack 允许在没有任何额外库的情况下更改 ant 的不可变属性(从 java 6 开始):
<scriptdef name="propertyreset" language="javascript"
description="Allows to assign @{property} new value">
<attribute name="name"/>
<attribute name="value"/>
project.setProperty(attributes.get("name"), attributes.get("value"));
</scriptdef>
用法:
<property name="x" value="10"/>
<propertyreset name="x" value="11"/>
<echo>${x}</echo> <!-- will print 11 -->
正如其他人所提到的,在所有规范方法被证明不适合之后,应谨慎使用。
属性在 ant 中是不可变的。
你可能对ant-contrib的var
任务感兴趣。
<var name="my_var" value="${my_property}" />
<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
根据您希望如何使用修改后的属性,您可以使用macrodef
s.
例如,而不是编写以下内容:
<target name="foo">
<echo message="${my_property}"/>
</target>
并且无法ant foo
用另一条消息打电话,你可以写:
<macrodef name="myecho">
<attribute name="msg"/>
<sequential>
<echo message="@{msg}"/>
</sequential>
</macrodef>
<target name="foo">
<myecho msg="${my_property}"/>
<property name="my_property2" value="..."/>
<myecho msg="${my_property2}"/>
</target>
从 Ant 1.8 开始,您可以使用“本地”任务来更改目标内的属性值。请注意,这不会更改具有相同名称的全局属性的值,但它是解决某些问题的一种方法。
看
您不能在 Ant 中更改属性的值。
如果您有一些 Ant 任务要重复运行并传入不同的值,我推荐该macrodef
任务,因为您可以重复运行相同的宏并传入不同的属性。
例如:
<macrodef name="copythings">
<attribute name="todir"/>
<sequential>
<copy todir="@{todir}">
<fileset dir="${src}">
<exclude name='**/*svn' />
</fileset>
</copy>
</sequential>
</macrodef>
<copythings todir="/path/to/target1"/>
<copythings todir="/path/to/target2"/>
注意,${property}
用于引用属性,@{attribute}
用于引用传递给 <macrodef>
任务的属性。
属性在 ant 中是不可变的。但这并不像看起来那么可怕。有一整类编程语言,其中(大多数)变量是常量,但它们可以完成工作,这被称为“函数式编程”。
您可以通过从旧属性派生新的、已更改的属性或在使用subant
或antcall
任务调用任务时更改参数来“更改”不同任务使用的值。如果您有创造力,通常可以找到解决问题的方法。
这是一个使用 local 和 basename 命令的示例。Var-unset 对我不起作用。
<for param="db-patches">
<path>
<fileset dir="${undeployed-files}" includes="**/ddl*.zip"/>
</path>
<sequential>
<local name="inpfile" />
<basename property="inpfile" file="@{db-patches}" suffix=".zip" />
<!-- unzip the patch -->
<unzip src="${undeployed-files}/${inpfile}.zip"
dest="${unzipped-patches}/${inpfile}" />
<move file="${undeployed-files}/${inpfile}.zip" tofile="${deployed-files}/${inpfile}.zip"/>
</sequential> </for>