J'ai un fichier Ant XML que j'utilise pour la construction.
J'ai 3 propriétés. Je veux casser la construction si ces propriétés ne contiennent aucune valeur. Je veux également casser la construction si la valeur est vide.
Comment puis-je faire cela dans Ant?
J'utilise Ant et non Ant-contrib.
Vous pouvez utiliser des conditions à l'aide de la tâche <fail>
:
<fail message="Property "foo" needs to be set to a value">
<condition>
<or>
<equals arg1="${foo}" arg2=""/>
<not>
<isset property="foo"/>
</not>
</or>
</condition>
Cela revient à dire if (not set ${foo} or ${foo} = "")
est un pseudocode. Vous devez lire les conditions XML de l'intérieur.
Vous auriez pu utiliser la clause <unless>
Sur la tâche <fail>
Si vous vous étiez soucié seulement de savoir si la variable était définie ou non, et non si elle avait une valeur réelle.
<fail message="Property "foo" needs to be set"
unless="foo"/>
Cependant, cela n'échouera pas si la propriété est définie, mais n'a aucune valeur.
Il y a une astuce qui peut rendre cela plus simple
<!-- Won't change the value of `${foo}` if it's already defined -->
<property name="foo" value=""/>
<fail message="Property "foo" has no value">
<condition>
<equals arg1="${foo}" arg2=""/>
</condition>
</fail>
N'oubliez pas que je ne peux pas réinitialiser une propriété! Si ${foo}
A déjà une valeur, la tâche <property>
Ci-dessus ne fera rien. De cette façon, je peux éliminer la condition <isset>
. Ce pourrait être bien puisque vous avez trois propriétés:
<property name="foo" value=""/>
<property name="bar" value=""/>
<property name="fubar" value=""/>
<fail message="You broke the build, you dufus">
<condition>
<or>
<equals arg1="${foo}" arg2=""/>
<equals arg1="${bar}" arg2=""/>
<equals arg1="${fubar}" arg2=""/>
</or>
</condition>
</fail>
S'appuyant sur les autres réponses, c'est ma forme préférée, en tant que macro:
<!-- Macro to require a property is not blank -->
<macrodef name="prop-require">
<attribute name="prop"/>
<sequential>
<fail message="Property "@{prop}" must be set">
<condition>
<not>
<isset property="@{prop}"/>
</not>
</condition>
</fail>
<fail message="Property "@{prop}" must not be empty">
<condition>
<equals arg1="${@{prop}}" arg2=""/>
</condition>
</fail>
</sequential>
</macrodef>
À utiliser comme:
<target name="deploy.war" description="Do the war deployment ;)">
<prop-require prop="target.vm" />
<prop-require prop="target.vip" />
<!-- ... -->
Par souci de concision, vous pouvez réduire les deux éléments d'échec en un à l'aide d'un <or>
, mais je préfère que mes messages d'erreur me traitent comme si je ne pouvais pas penser par moi-même;)
Avec Ant addon Flaka vous pouvez utiliser des modèles comme:
<property name="foo" value="bar"/>
...
<fl:unless test="has.property.foo">
...
</fl:unless>
...
<fl:when test="has.property.foo">
...
</fl:when>
Contrôle concret de la vacuité:
<fl:when test=" empty '${foo}' ">
<fail message="Houston we have a problem!!"/>
</fl:when>
Un exemple complet, en utilisant également un contrôle égal avec 'eq' (l'opposé serait 'neq'):
<project xmlns:fl="antlib:it.haefelinger.flaka">
<!-- some if/then/else construct -->
<fl:choose>
<!-- if -->
<when test=" '${buildtype}' eq 'prod' ">
<!-- then -->
<echo>..starting ProductionBuild</echo>
</when>
<when test=" '${buildtype}' eq 'test' ">
<!-- then -->
<echo>..starting TestBuild</echo>
</when>
<!-- else -->
<otherwise>
<fl:unless test="has.property.dummybuild">
<fail message="No valid buildtype !, found => '${buildtype}'"/>
</fl:unless>
<echo>.. is DummyBuild</echo>
</otherwise>
</fl:choose>
</project>
sortie avec ant -f build.xml -Dbuildtype = prod
ou
ant -f build.xml -Dbuildtype = prod -Ddummybuild = quelle que soit
[echo] ..starting ProductionBuild
sortie avec typo => ant - build.xml -Dbuildtype = testt
BUILD FAILED
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => 'testt'
sortie avec ant -f build.xml -Ddummybuild = que ce soit
[echo] .. is DummyBuild
Je suis sur une ancienne version d'Ant, donc isset n'était pas disponible. Au lieu de cela, j'ai utilisé la notation suivante avec le double $ dans les égaux.
<target name="xxx">
<echo message="${contextRoot}" />
<if>
<!-- check if the contextRoot property is defined. -->
<equals arg1="${contextRoot}" arg2="$${contextRoot}" />
<then>
<!-- it isn't set, set a default -->
<property name="contextRoot" value="/WebAppCtx" />
</then>
</if>
<echo message="${contextRoot}" />
</target>
Vous pouvez essayer d'utiliser conditions ... ou de créer une cible avec sauf