2009-12-08 4 views

Répondre

11

Selon la manière dont vous souhaitez utiliser la propriété modifiée, vous pouvez utiliser macrodef s.

Par exemple, au lieu d'écrire ce qui suit:

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

et ne pas être en mesure d'appeler ant foo avec un autre message, vous pouvez écrire:

<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 tâche peut faire:

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

Non recommandé, cependant, il peut conduire à d'étranges effets secondaires si une partie de vos scripts Ant prennent des valeurs de propriété immuables, et d'autres parties rompent cette hypothèse.

+2

La tâche var est particulièrement intéressante pour les "variables locales", par ex. dans les boucles (aussi une tâche de l'excellent ant-contrib). Un inconvénient, cependant, est que la tâche var ne supporte pas l'attribut "location". – akr

10

Les propriétés sont immuables dans ant.

Vous pouvez être intéressé par 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

Les propriétés sont immuables dans ant. Mais ce n'est pas une limitation aussi terrible que cela puisse paraître. Il y a une classe entière de langages de programmation où (la plupart) des variables sont constantes et pourtant ils obtiennent des choses   ceci est appelé «programmation fonctionnelle».

Vous pouvez «modifier» les valeurs utilisées par différentes tâches en dérivant de nouvelles propriétés modifiées ou en modifiant les paramètres lors de l'appel de tâches avec les tâches subant ou antcall. Si vous êtes créatif, vous pouvez généralement trouver un moyen de résoudre votre problème.

+1

c'est très utile si vous donnez un exemple et expliquez plus. –

4

Vous ne pouvez pas modifier la valeur d'une propriété dans Ant.

Si vous avez des tâches Ant que vous souhaitez exécuter de façon répétée en transmettant différentes valeurs, je recommande le macrodef task car vous pouvez exécuter plusieurs fois la même macro en transmettant différents attributs.

Par exemple:

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

Notez que ${property} est utilisé pour référencer des propriétés et @{attribute} permet de référencer les attributs transmis à la tâche <macrodef>.

8

Depuis Ant 1.8, vous pouvez utiliser le tâche "locale" pour changer la valeur d'une propriété dans une cible. Notez que cela ne change PAS la valeur de la propriété globale avec le même nom mais c'est un moyen de résoudre certains problèmes.

Voir

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

20

Par souci de justice, il y a un hack qui permet de modifier les propriétés immuables de fourmi sans libs supplémentaires (depuis 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> 

Utilisation:

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

Comme d'autres mentionné, cela devrait être utilisé avec précaution après que toutes les approches canoniques se sont révélées inadaptées.

0

Voici un exemple utilisant local avec la commande basename. Var-unset ne fonctionne pas pour moi.

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