java - descargar - Filtrado de hormigas: falla si la propiedad no está configurada
building apache ant (5)
Iba a sugerir que intentara usar <property file="${filter.file}" prefix="filter">
para cargar realmente las propiedades en Ant, y luego fail
si alguna de ellas no estuviera configurada, pero creo Estaba interpretando mal tu problema (que querías fallar si una propiedad específica no estaba configurada en el archivo de propiedades).
Creo que su mejor opción podría ser usar <exec>
para (dependiendo de su plataforma de desarrollo) hacer un grep para el carácter "@", y luego establecer una propiedad para el número de ocurrencias encontradas. No estoy seguro de la sintaxis exacta, pero ...
<exec command="grep /"@/" ${build.dir} | wc -l" outputproperty="token.count"/>
<condition property="token.found">
<not>
<equals arg1="${token.count}" arg2="0"/>
</not>
</condition>
<fail if="token.found" message="Found token @ in files"/>
Tengo un build.xml
hormiga que usa la tarea <copy>
para copiar una variedad de archivos xml. Utiliza el filtrado para combinar las propiedades de un archivo build.properties
. Cada entorno (dev, stage, prod) tiene una build.properties
diferente que almacena la configuración para ese entorno.
A veces agregamos nuevas propiedades a Spring XML u otros archivos de configuración que requieren la actualización del archivo build.properties
.
Quiero que la hormiga falle rápidamente si faltan propiedades en build.properties
. Es decir, si algún @...@
tokens en bruto lo hace en los archivos generados, quiero que la creación fallezca para que el usuario sepa que necesita agregar una o más propiedades a sus build.properties locales.
¿Es esto posible con las tareas integradas? No pude encontrar nada en los documentos. Estoy a punto de escribir una tarea de hormiga personalizada, pero tal vez pueda ahorrarme el esfuerzo.
Gracias
Puede hacerlo en Ant 1.7, usando una combinación de la tarea LoadFile
y la condición de match
.
<loadfile property="all-build-properties" srcFile="build.properties"/>
<condition property="missing-properties">
<matches pattern="@[^@]*@" string="${all-build-properties}"/>
</condition>
<fail message="Some properties not set!" if="missing-properties"/>
Si el comando exec está en desuso en su versión de ant, puede usar los redirectores, algo como:
<exec executable="grep">
<arg line="@ ${build.dir}"/>
<redirector outputproperty="grep.out"/>
</exec>
<exec executable="wc" inputstring="${grep.out}">
<arg line="-l"/>
<redirector outputproperty="token.found"/>
</exec>
para crear la propiedad token.found
<condition property="token.found">
<not>
<equals arg1="${token.count}" arg2="0"/>
</not>
</condition>
<fail if="token.found" message="Found token @ in files"/>
para el conditonal
Si está buscando una propiedad específica, puede usar la tarea de falla con el atributo "menos", por ejemplo:
<fail unless="my.property">Computer says no. You forgot to set ''my.property''!</fail>
Como la condition
Ant 1.6.2 también se puede anidar dentro del fail
.
La siguiente macro hace que sea fácil verificar condicionalmente múltiples propiedades.
<macrodef name="required-property">
<attribute name="name"/>
<attribute name="prop" default="@{name}"/>
<attribute name="if" default="___"/>
<attribute name="unless" default="___"/>
<sequential>
<fail message="You must set property ''@{name}''">
<condition>
<and>
<not><isset property="@{prop}"/></not>
<or>
<equals arg1="@{if}" arg2="___"/>
<isset property="@{if}"/>
</or>
<or>
<equals arg1="@{unless}" arg2="___"/>
<not><isset property="@{unless}"/></not>
</or>
</and>
</condition>
</fail>
</sequential>
</macrodef>
<target name="required-property.test">
<property name="prop" value=""/>
<property name="cond" value="set"/>
<required-property name="prop"/>
<required-property name="prop" if="cond"/>
<required-property name="prop" unless="cond"/>
<required-property name="prop" if="cond2"/>
<required-property name="prop" unless="cond2"/>
<required-property name="prop" if="cond" unless="cond"/>
<required-property name="prop" if="cond" unless="cond2"/>
<required-property name="prop" if="cond2" unless="cond"/>
<required-property name="prop" if="cond2" unless="cond2"/>
<required-property name="prop2" unless="cond"/>
<required-property name="prop2" if="cond2"/>
<required-property name="prop2" if="cond2" unless="cond"/>
<required-property name="prop2" if="cond" unless="cond"/>
<required-property name="prop2" if="cond2" unless="cond2"/>
<required-property name="success"/>
</target>