web-dev-qa-db-fra.com

Comment vérifier si une propriété a une valeur dans Ant

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.

36
KK99

Vous pouvez utiliser des conditions à l'aide de la tâche <fail>:

<fail message="Property &quot;foo&quot; 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 &quot;foo&quot; 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 &quot;foo&quot; 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>
60
David W.

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 &quot;@{prop}&quot; must be set">
            <condition>
                <not>
                    <isset property="@{prop}"/>
                </not>
           </condition>
        </fail>

        <fail message="Property &quot;@{prop}&quot; 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;)

12
Ben Page

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

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

Vous pouvez essayer d'utiliser conditions ... ou de créer une cible avec sauf

0
Laur Ivan