svt - ant turnos
Ant antcall un objetivo que define una propiedad (5)
@ alem0lars, ya que dijo que le gustaría subdividir un objetivo, permítame ofrecerle una solución diferente (que desafortunadamente no responde su pregunta original).
<project default="mytarg">
<target name="mytarg">
<property name="tgt" value="build"/>
<antcall target="deps"/>
</target>
<target name="deps" depends="aTgt,bTgt"/>
<target name="aTgt">
<echo>"In aTgt doing a ${tgt}"</echo>
</target>
<target name="bTgt">
<echo>"In bTgt doing a ${tgt}"</echo>
</target>
</project>
Esto subdivide la construcción en aTgt y bTgt.
La salida será
aTgt:
[echo] "In aTgt doing a build"
bTgt:
[echo] "In bTgt doing a build"
deps:
BUILD SUCCESSFUL
En Ant, quiero definir un objetivo (llamado A
) que define una propiedad y antcall
desde otro objetivo (llamado B
). Quiero que el objetivo B
, después de recuperar el destino A
, pueda acceder a la propiedad definida en el objetivo A
Por ejemplo:
<target name="B">
<antcall target="A" inheritAll="true" inheritRefs="true" />
<echo>${myprop}</echo>
</target>
<target name="A">
<property name="myprop" value="myvalue" />
</target>
Sin embargo, no funciona y <echo>${myprop}</echo>
no imprime myvalue
(creo que la propiedad myprop
no está definida en B
).
¿Hay alguna forma de hacer eso?
Creo que quieres usar un param.
<project default="B">
<target name="B">
<antcall target="A">
<param name="myprop" value="myvalue"/>
</antcall>
</target>
<target name="A">
<echo>${myprop}</echo>
</target>
</project>
Rodé esto con una etiqueta de proyecto y moví la declaración de eco a "A". Mi salida dice
B:
A:
[echo] myvalue
BUILD SUCCESSFUL
En lugar de usar <antcall>
, ¿por qué no solo tener el objetivo B depende del objetivo A ?
<target name="B" depends="A">
<echo>${myprop}</echo>
</target>
<target name="A">
<property name="myprop" value="myvalue" />
</target>
Otro enfoque es refactorizar tus objetivos en macros. Usted está tratando de usar objetivos como funciones y simplemente no están destinados a ser utilizados de esa manera. Normalmente escribo la mayor parte de mi lógica como macros, de modo que pueda componerla más fácilmente en macros más complicadas. Luego escribo objetivos de envoltorio simples para los puntos de entrada de línea de comandos que necesito.
Según las preguntas frecuentes de Apache Ant :
<target name="cond" depends="cond-if"/>
<target name="cond-if" if="prop1">
<antcall target="cond-if-2"/>
</target>
<target name="cond-if-2" if="prop2">
<antcall target="cond-if-3"/>
</target>
<target name="cond-if-3" unless="prop3">
<echo message="yes"/>
</target>
Note: <antcall> tasks do not pass property changes back up to the environment they were called from, so you wouldn''t be able to, for example, set a result property in the cond-if-3 target, then do <echo message="result is ${result}"/> in the cond target.
En este sentido, es imposible hacer lo que quieres usando antcall.
========== editar ===========
Intente antcallback
: AntCallBack es idéntico a la tarea estándar ''antcall'', excepto que permite que las propiedades establecidas en el destino llamado estén disponibles en el destino que llama.
http://antelope.tigris.org/nonav/docs/manual/bk03ch20.html
Código de muestra pegado de la página anterior:
<target name="testCallback" description="Test CallBack">
<taskdef name="antcallback" classname="ise.antelope.tasks.AntCallBack" classpath="${antelope.home}/build" />
<antcallback target="-testcb" return="a, b"/>
<echo>a = ${a}</echo>
<echo>b = ${b}</echo>
</target>
<target name="-testcb">
<property name="a" value="A"/>
<property name="b" value="B"/>
</target>