Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ant中重写属性?_Ant_Properties_Task - Fatal编程技术网

如何在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

有没有办法为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>   <!-- 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>