30

有没有办法重新分配 Antproperty任务的值?或者是否有其他任务可用于此目的?

4

8 回答 8

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

但不推荐,如果您的 Ant 脚本的某些部分假设不可变的属性值,而其他部分打破了这个假设,它可能会导致奇怪的副作用。

于 2009-12-08T12:47:45.027 回答
26

为了公正起见,有一个 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 -->

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

于 2012-10-31T05:54:51.540 回答
12

属性在 ant 中是不可变的。

你可能对ant-contribvar任务感兴趣。

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

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
于 2009-12-08T12:49:15.013 回答
11

根据您希望如何使用修改后的属性,您可以使用macrodefs.

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

<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>
于 2009-12-10T19:51:33.767 回答
10

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

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

于 2012-08-09T14:29:40.880 回答
4

您不能在 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>任务的属性。

于 2009-12-08T12:58:13.493 回答
2

属性在 ant 中是不可变的。但这并不像看起来那么可怕。有一整类编程语言,其中(大多数)变量是常量,但它们可以完成工作,这被称为“函数式编程”。

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

于 2009-12-08T12:54:56.033 回答
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>
于 2015-08-17T19:46:16.677 回答