2012-02-09 30 views
30

Tengo un archivo Ant XML que utilizo para compilación.Cómo comprobar si una propiedad tiene valor en Ant

Tengo 3 propiedades. Quiero romper la compilación si estas propiedades no contienen ningún valor. También quiero romper la compilación si el valor está vacío.

¿Cómo puedo hacer esto en Ant?

I a usando Ant y no Ant-contrib.

+0

posible duplicado de [filtrado hormiga - fallar si la propiedad no especificado] (http://stackoverflow.com/questions/226683/ant-filtering-fail-if-property-not-set) – oers

Respuesta

52

Puede utilizar condiciones mediante la tarea <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> 

Esto es equivalente a decir if (not set ${foo} or ${foo} = "") es pseudocódigo. Debes leer las condiciones XML desde adentro hacia afuera.

Podría haber usado la cláusula <unless> en la tarea <fail> si solo le importaba si la variable estaba configurada o no, y no si tenía un valor real.

<fail message="Property &quot;foo&quot; needs to be set" 
    unless="foo"/> 

Sin embargo, esto no fallará si la propiedad está configurada, pero no tiene ningún valor.


Hay un truco que puede hacerlo mas 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> 

Recuerde que no puedo restablecer una propiedad! Si ${foo} ya tiene un valor, la tarea anterior <property> no hará nada. De esta forma, puedo eliminar la condición <isset>.Puede ser que sea muy bueno, ya que tiene tres propiedades:

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

tanques. Funciona muy bien para mí – KK99

+0

Es bueno evitar los ifs anidados. También se puede configurar la propiedad y el valor de la condición. – user1587504

+0

¡Gran respuesta! Noté que a la última declaración de error le falta una etiqueta de cierre adecuada -> la barra oblicua falta y no puedo corregirla ya que la edición requiere cambiar al menos 6 caracteres: < – AgentKnopf

0

Usted podría tratar de usar conditions ... o la creación de un objetivo con unless

0

Con Ant addon Flaka puede usar patrones como:

<property name="foo" value="bar"/> 
... 
    <fl:unless test="has.property.foo"> 
    ... 
    </fl:unless> 
... 
    <fl:when test="has.property.foo"> 
    ... 
    </fl:when> 

cheque hormigón para emptyness:

<fl:when test=" empty '${foo}' "> 
    <fail message="Houston we have a problem!!"/> 
</fl:when> 

Un ejemplo completo, también usando algunos controles iguales con 'eq' (opuesto a ULD ser '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> 

salida con ant -f build.xml -Dbuildtype = prod
o
ant -f build.xml -Dbuildtype = prod -Ddummybuild = cualquier

[echo] ..starting ProductionBuild 

salida con errata => ant - build.xml -Dbuildtype = testt

BUILD FAILED 
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => 'testt' 

de salida con ant -f build.xml -DD ummybuild = lo

[echo] .. is DummyBuild 
12

de construcción en las otras respuestas, esta es mi forma preferida, como un 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> 

para ser utilizado como:

<target name="deploy.war" description="Do the war deployment ;)"> 
    <prop-require prop="target.vm" /> 
    <prop-require prop="target.vip" /> 
    <!-- ... --> 

Para abreviar, puede contraer los dos elementos de error en uno utilizando un <or>, pero prefiero mis mensajes de error para tratarme como si no pudiera pensarlo;)

0

Estoy en una versión anterior de Ant, por lo que isset no estaba disponible. En su lugar, utilicé la siguiente notación con el doble $ en los equivalentes.

<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> 
Cuestiones relacionadas