如何在Ant中覆盖属性?

29 ant properties task

有没有办法重新分配Ant property任务的值?或者还有其他任务可用于此目的吗?

ska*_*man 34

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 -->
Run Code Online (Sandbox Code Playgroud)

但是,不建议,如果Ant脚本的某些部分采用不可变属性值,则可能导致奇怪的副作用,而其他部分则会破坏此假设.

  • var任务对于"局部变量"特别好,例如for for循环(也是来自优秀ant-contrib的任务).但是,一个缺点是var任务不支持"location"属性. (2认同)

Vad*_*zim 22

为了正义起见,有一个hack允许在没有任何额外的lib的情况下改变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>
Run Code Online (Sandbox Code Playgroud)

用法:

    <property name="x" value="10"/>
    <propertyreset name="x" value="11"/>
    <echo>${x}</echo>   <!-- will print 11 -->
Run Code Online (Sandbox Code Playgroud)

正如其他人所提到的,在所有规范方法证明不合适之后,应谨慎使用.


jam*_*esh 11

属性在ant中是不可变的.

您可能对ant-contribvar任务感兴趣.

<var name="my_var" value="${my_property}" />

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 11

根据您要使用修改后的属性的方式,您可以使用macrodefs.

例如,而不是编写以下内容:

<target name="foo">
   <echo message="${my_property}"/>
</target>
Run Code Online (Sandbox Code Playgroud)

并且无法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>
Run Code Online (Sandbox Code Playgroud)


BPS*_*BPS 9

从Ant 1.8开始,您可以使用"本地"任务来更改目标中属性的值.请注意,这不会更改具有相同名称的全局属性的值,但它是解决某些问题的方法.

看到

http://ant.apache.org/manual/Tasks/local.html