Existe-t-il un moyen de réaffecter la valeur de la tâche Ant property
? Ou y a-t-il une autre tâche disponible à cette fin?
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 pouvant pas appeler ant foo
avec un autre message, vous pourriez é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>
La tâche ant/contribVariable
peut le 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, cela peut entraîner des effets secondaires étranges si des parties de vos scripts Ant prennent des valeurs de propriété immuables, et si d'autres parties brisent cette hypothèse.
Pour des raisons de justice, il existe un hack qui permet de modifier les propriétés immuables de ant sans aucune bibliothèque 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>
Usage:
<property name="x" value="10"/>
<propertyreset name="x" value="11"/>
<echo>${x}</echo> <!-- will print 11 -->
Comme d'autres l'ont mentionné, il convient de l'utiliser avec précaution après que toutes les approches canoniques se sont révélées inadéquates.
Les propriétés sont immuables chez ant.
Vous pourriez ê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>
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 modifie PAS la valeur de la propriété globale portant le même nom, mais constitue un moyen de résoudre certains problèmes.
Voir
Vous ne pouvez pas modifier la valeur d'une propriété dans Ant.
Si vous souhaitez exécuter plusieurs fois des tâches Ant en transmettant différentes valeurs, je vous recommande la tâche macrodef
, car vous pouvez exécuter la même macro en transmettant de manière répétée des attributs différents.
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 les propriétés et @{attribute}
pour référencer les attributs transmis à la tâche <macrodef>
.
Les propriétés sont immuables chez ant. Mais ce n’est pas une limite aussi terrible que cela puisse paraître. Il y a toute une classe de langages de programmation où (la plupart) les variables sont constantes et pourtant, elles obtiennent des résultats, on parle de "programmation fonctionnelle".
Vous pouvez "modifier" les valeurs utilisées par différentes tâches en dérivant des propriétés nouvelles, modifiées ou anciennes, ou en modifiant les paramètres lorsque vous appelez des 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>