traduccion - ant turnos
Hormiga si otra condiciĆ³n? (5)
¿Existe una condición if / else que pueda usar para una tarea Ant?
Esto es lo que he escrito hasta ahora:
<target name="prepare-copy" description="copy file based on condition">
<echo>Get file based on condition</echo>
<copy file="${some.dir}/true" todir="." if="true"/>
</target>
El script anterior copiará el archivo si una condición es verdadera. ¿Qué sucede si la condición es falsa y deseo copiar otro archivo? ¿Es eso posible en Ant?
Podría pasar un parámetro a la tarea anterior y asegurarme de que el parámetro que se aprobó es
Como hormiga 1.9.1 puede usar una condición if: set: https://ant.apache.org/manual/ifunless.html
El atributo if
no existe para <copy>
. Se debe aplicar al <target>
.
A continuación se muestra un ejemplo de cómo se puede usar el atributo depends
de un objetivo y los atributos if
y unless
para controlar la ejecución de objetivos dependientes. Solo uno de los dos debería ejecutar.
<target name="prepare-copy" description="copy file based on condition"
depends="prepare-copy-true, prepare-copy-false">
</target>
<target name="prepare-copy-true" description="copy file based on condition"
if="copy-condition">
<echo>Get file based on condition being true</echo>
<copy file="${some.dir}/true" todir="." />
</target>
<target name="prepare-copy-false" description="copy file based on false condition"
unless="copy-condition">
<echo>Get file based on condition being false</echo>
<copy file="${some.dir}/false" todir="." />
</target>
Si está utilizando ANT 1.8+, puede usar la expansión de propiedad y evaluará el valor de la propiedad para determinar el valor booleano. Por lo tanto, podría usar if="${copy-condition}"
lugar de if="copy-condition"
.
En ANT 1.7.1 y versiones anteriores, especifica el nombre de la propiedad. Si la propiedad está definida y tiene algún valor (incluso una cadena vacía), se evaluará como verdadero.
La sintaxis peculiar que usa condiciones en el objetivo (descrita por Mads) es la única forma admitida de realizar una ejecución condicional en el núcleo ANT.
ANT no es un lenguaje de programación y cuando las cosas se complican elijo insertar un script dentro de mi compilación de la siguiente manera:
<target name="prepare-copy" description="copy file based on condition">
<groovy>
if (properties["some.condition"] == "true") {
ant.copy(file:"${properties["some.dir"]}/true", todir:".")
}
</groovy>
</target>
ANT admite varios idiomas (Ver tarea de script ), mi preferencia es Groovy debido a su sintaxis concisa y porque funciona muy bien con la compilación.
Disculpas, David. No soy fanático de ant-contrib .
También puedes hacer esto con la tarea de contr contr si .
<if>
<equals arg1="${condition}" arg2="true"/>
<then>
<copy file="${some.dir}/file" todir="${another.dir}"/>
</then>
<elseif>
<equals arg1="${condition}" arg2="false"/>
<then>
<copy file="${some.dir}/differentFile" todir="${another.dir}"/>
</then>
</elseif>
<else>
<echo message="Condition was neither true nor false"/>
</else>
</if>
<project name="Build" basedir="." default="clean">
<property name="default.build.type" value ="Release"/>
<target name="clean">
<echo>Value Buld is now ${PARAM_BUILD_TYPE} is set</echo>
<condition property="build.type" value="${PARAM_BUILD_TYPE}" else="${default.build.type}">
<isset property="PARAM_BUILD_TYPE"/>
</condition>
<echo>Value Buld is now ${PARAM_BUILD_TYPE} is set</echo>
<echo>Value Buld is now ${build.type} is set</echo>
</target>
</project>
En mi caso, DPARAM_BUILD_TYPE=Debug
si se proporciona más que, debo compilar para Debug, de lo contrario, tengo que ir para compilar Release build. Escribo como la condición anterior funcionó y he probado como a continuación está funcionando bien para mí.
Y la propiedad ${build.type}
podemos pasar esto a otro objetivo o macrodef para el procesamiento que estoy haciendo en mi otra macrodef.
D:/>ant -DPARAM_BUILD_TYPE=Debug
Buildfile: D:/build.xml
clean:
[echo] Value Buld is now Debug is set
[echo] Value Buld is now Debug is set
[echo] Value Buld is now Debug is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
D:/>ant
Buildfile: D:/build.xml
clean:
[echo] Value Buld is now ${PARAM_BUILD_TYPE} is set
[echo] Value Buld is now ${PARAM_BUILD_TYPE} is set
[echo] Value Buld is now Release is set
main:
BUILD SUCCESSFUL
Total time: 0 seconds
Me funciona para implementar la condición así que espero que sea útil.