如何在Ant中覆盖属性?

时间:2009-12-08 12:44:05

标签: ant properties task

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

8 个答案:

答案 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-contribvar 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开始,您可以使用“本地”任务来更改目标中属性的值。请注意,这不会更改具有相同名称的全局属性的值,但它是解决某些问题的方法。

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

答案 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中是不可变的。但这并不像看起来那么严重。有一大类编程语言,其中(大多数)变量是常量的,但是他们完成了这些工作,这称为“函数式编程”。

您可以通过从旧版本中导出新的,已更改的属性或在使用subantantcall任务调用任务时更改参数来“​​更改”不同任务使用的值。如果您有创意,通常可以找到解决问题的方法。

答案 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>