有没有办法为Ant property
任务重新分配值?或者还有其他任务可用于此目的吗?
答案 0 :(得分:34)
ant-contrib's 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脚本的某些部分采用不可变的属性值,它会导致奇怪的副作用,而其他部分则会破坏这种假设。
答案 1 :(得分:22)
为了正义,有一个hack允许更改ant的不可变属性而不需要任何额外的libs(因为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 -->
正如其他人所提到的,在所有规范方法证明不合适之后,应谨慎使用。
答案 2 :(得分:11)
根据您希望如何使用修改后的属性,您可以使用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>
答案 3 :(得分:10)
属性在ant中是不可变的。
您可能对ant-contrib的var
task感兴趣。
<var name="my_var" value="${my_property}" />
<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
答案 4 :(得分:9)
从Ant 1.8开始,您可以使用“本地”任务来更改目标中属性的值。请注意,这不会更改具有相同名称的全局属性的值,但它是解决某些问题的方法。
见
答案 5 :(得分:4)
您无法更改Ant中的属性值。
如果您有一些Ant任务要反复传递不同的值,我建议使用macrodef
task,因为您可以重复传入不同的属性来运行相同的宏。
例如:
<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>
任务的属性。
答案 6 :(得分:2)
属性在ant中是不可变的。但这并不像看起来那么严重。有一大类编程语言,其中(大多数)变量是常量的,但是他们完成了这些工作,这称为“函数式编程”。
您可以通过从旧版本中导出新的,已更改的属性或在使用subant
或antcall
任务调用任务时更改参数来“更改”不同任务使用的值。如果您有创意,通常可以找到解决问题的方法。
答案 7 :(得分:0)
以下是使用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>