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