2009-12-08 14 views

Respuesta

11

Dependiendo de cómo quiera utilizar la propiedad modificada, puede usar macrodef s.

Por ejemplo, en lugar de escribir la siguiente:

<target name="foo"> 
    <echo message="${my_property}"/> 
</target> 

y no ser capaz de llamar a ant foo con otro mensaje, se podría escribir:

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

ant-contrib'sVariable tarea puede hacer esto:

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

No se recomienda, sin embargo, puede conducir a efectos secundarios extraños si las partes de los scripts Ant asumen valores de las propiedades inmutables, y otras partes rompen esta suposición.

+2

La tarea var es especialmente útil para las "variables locales", p. Ej. in para bucles (también una tarea del excelente ant-contrib). Un inconveniente, sin embargo, es que la tarea var no admite el atributo "ubicación". – akr

10

Las propiedades son inmutables en hormiga.

Usted podría estar interesado en ant-contrib 's var task.

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

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo> 
2

Las propiedades son inmutables en ant. Pero esa no es una limitación tan terrible como pueda parecer. Hay toda una clase de lenguajes de programación donde (la mayoría) de las variables son constantes y aún así hacen cosas   esto se llama "programación funcional".

Puede "cambiar" los valores utilizados por diferentes tareas derivando propiedades nuevas y modificadas de las anteriores o cambiando los parámetros al llamar tareas con las tareas subant o antcall. Si eres creativo, generalmente puedes encontrar una manera de resolver tu problema.

+1

es muy útil si das un ejemplo y explicas más. –

4

No se puede cambiar el valor de una propiedad en Ant.

Si tiene algunas tareas Ant que desea ejecutar repetidamente pasando diferentes valores, recomiendo el macrodef task ya que puede ejecutar la misma macro pasando repetidamente diferentes atributos.

Por ejemplo:

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

Tenga en cuenta que ${property} se utiliza para hacer referencia a propiedades y @{attribute} se utiliza para hacer referencia a los atributos pasados ​​a la tarea <macrodef>.

8

Desde Ant 1.8, puede utilizar la tarea "local" para cambiar el valor de una propiedad dentro de un objetivo. Tenga en cuenta que esto NO cambia el valor de la propiedad global con el mismo nombre, pero es una forma de resolver algunos problemas.

Ver

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

20

En aras de la justicia, hay un truco que permite alterar las propiedades inmutables de hormigas sin ningún tipo de librerías adicionales (desde 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> 

Uso:

<property name="x" value="10"/> 
    <propertyreset name="x" value="11"/> 
    <echo>${x}</echo> <!-- will print 11 --> 

Como han mencionado otros, esto debería ser utilizado con cuidado después de que todos los enfoques canónicos demostraron no encajar.

0

Aquí hay una muestra que usa local con el comando basename. Var-unset no funciona para mí.

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