如何在Ant中重写属性?
有没有办法为Ant如何在Ant中重写属性?,ant,properties,task,Ant,Properties,Task,有没有办法为Ant属性任务重新分配值?或者是否有其他任务可用于此目的?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
属性
任务重新分配值?或者是否有其他任务可用于此目的?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 -->
${x}
${x}
不过,不建议这样做,如果Ant脚本的某些部分假设属性值不可变,而其他部分则打破了这一假设,则可能会导致奇怪的副作用。属性在Ant中是不可变的 您可能对的感兴趣
地址相同:${my_var}和${my_property}
属性在ant中是不可变的。但这并不像看上去那么可怕。有一整类编程语言,其中(大多数)变量都是常量,但它们完成的工作称为“函数式编程”
您可以通过从旧属性派生新的、已更改的属性,或在使用
subant
或antcall
任务调用任务时更改参数,来“更改”不同任务使用的值。如果你有创造力,你通常可以找到解决问题的方法。你不能在Ant中更改属性的值
如果您有一些Ant任务要重复运行并传递不同的值,我建议您使用,因为您可以重复运行相同的宏并传递不同的属性
例如:
<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}
用于引用传递给
任务的属性。根据您希望如何使用修改的属性,您可以使用宏定义
例如,不要编写以下内容:
<target name="foo">
<echo message="${my_property}"/>
</target>
从Ant1.8开始,您可以使用“本地”任务更改目标中属性的值。请注意,这不会更改同名全局属性的值,但可以解决一些问题
看
为了公正起见,有一种黑客技术允许在不增加任何lib的情况下更改ant的不可变属性(自java 6以来):
setProperty(attributes.get(“name”)、attributes.get(“value”);
用法:
<property name="x" value="10"/>
<propertyreset name="x" value="11"/>
<echo>${x}</echo> <!-- will print 11 -->
${x}
正如其他人所提到的,在所有规范化方法都被证明不适合之后,应该谨慎地使用它。下面是一个使用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>
var任务对于“局部变量”特别好,例如for循环(也是优秀ant contrib的任务)。不过,var任务的一个缺点是不支持“location”属性。如果您给出一个示例并进行更多解释,这将非常有用。
<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 -->
<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>