Comment sur-Écrire la propriété dans Ant?

Existe-t-il un moyen de réattribuer la valeur de la tâche Ant property? Ou y a-t-il une autre tâche disponible à cette fin?

28
demandé sur dcharles 2009-12-08 15:44:05

8 réponses

Selon la façon 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 pouvant pas 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>
11
répondu Vladimir 2009-12-10 19:51:33

Ant-contrib de l' Variable la tâche peut faire ceci:

<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, cela peut entraîner des effets secondaires étranges si des parties de vos scripts Ant supposent des valeurs de propriété immuables, et d'autres parties cassent cette hypothèse.

33
répondu skaffman 2009-12-08 12:55:15

Par souci de justice, il existe un hack qui permet de modifier les propriétés immuables d'ant sans aucune libs supplémentaire (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 l'ont mentionné, cela devrait être utilisé avec précaution après que toutes les approches canoniques se sont avérées ne pas convenir.

22
répondu Vadzim 2012-10-31 05:54:51

Les propriétés sont immuables dans ant.

Vous pouvez être intéressé par ant-contrib's var tâche.

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

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo>
10
répondu jamesh 2016-08-23 09:40:15

Depuis Ant 1.8, Vous pouvez utiliser la tâche "locale" pour modifier 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

8
répondu BPS 2012-08-09 14:29:40

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

Si vous avez des tâches Ant que vous voulez exécuter à plusieurs reprises en passant des valeurs différentes, je recommande le macrodef task comme vous pouvez exécuter la même macro à plusieurs reprises en passant 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 {[2] } est utilisé pour référencer les propriétés et @{attribute} est utilisé pour référencer les attributs passés à la tâche <macrodef>.

4
répondu Dave Webb 2011-01-12 00:44:32

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 toute une classe de langages de programmation où (la plupart) des variables sont constantes et pourtant elles font des choses c'est ce qu'on appelle la "programmation fonctionnelle."

Vous pouvez "modifier" les valeurs utilisées par différentes tâches en dérivant de nouvelles propriétés modifiées des anciennes 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.

2
répondu Carl Smotricz 2009-12-08 12:54:56

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>
0
répondu Steven Moslin 2015-08-17 19:46:16