traduccion - ant turnos
Cómo verificar si una propiedad tiene valor en Ant (5)
Con Ant addon Flaka puedes usar patrones como:
<property name="foo" value="bar"/>
...
<fl:unless test="has.property.foo">
...
</fl:unless>
...
<fl:when test="has.property.foo">
...
</fl:when>
Verificación concreta para el vacío:
<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 sería ''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 = whatever
[echo] ..starting ProductionBuild
salida con typo => ant - build.xml -Dbuildtype = testt
BUILD FAILED
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => ''testt''
salida con ant -f build.xml -Ddummybuild = whatever
[echo] .. is DummyBuild
Tengo un archivo Ant XML que uso para compilación.
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?
Estoy usando Ant y no Ant-contrib.
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>
Podría intentar usar conditions ... o crear un objetivo a unless
Sobre la base de las otras respuestas, esta es mi forma preferida, como una 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>
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, puedes colapsar los dos elementos de falla en uno usando un <or>
, pero prefiero mis mensajes de error para tratarme como si no pudiera pensar por mí mismo;)
Puede usar condiciones usando la tarea <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>
Esto es equivalente a decir if (not set ${foo} or ${foo} = "")
es un seudocó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 tiene un valor real.
<fail message="Property "foo" 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 hacer esto más 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>
¡Recuerda que no puedo restablecer una propiedad! Si ${foo}
ya tiene un valor, la tarea <property>
anterior no hará nada. De esta forma, puedo eliminar la <isset>
. Puede ser 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>