2011-03-11 7 views
18

En Ant Quiero definir un objetivo (llamado A) que define una propiedad y antcall desde otro destino (llamado B). Quiero que el objetivo B, después de llamar al objetivo A, pueda acceder a la propiedad definida en el destino A.Ant anticapa un objetivo que define una propiedad

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 no se imprime <echo>${myprop}</echo>myvalue (creo porque la propiedad myprop no está definido en B).

¿Hay alguna manera de hacerlo?

+0

¿Te importaría revisar tu pregunta? Probablemente no tenía la intención de tener una llamada B B. – rajah9

+0

@ rajah9: Quiero definir la propiedad en el objetivo A y hacer eco en el objetivo B. El objetivo A se llama desde el objetivo B. El problema principal es que querer crear un objetivo y dividirlo en subtargets. – alem0lars

Respuesta

11

De acuerdo con la Apache Ant FAQ:

<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 para hacer lo que desee con antcall.

========== edición ===========

Trate antcallback: AntCallBack es idéntica a la 'antcall' tarea estándar, salvo que permite propiedades establecidas en el objetivo llamado para estar disponible en el destino de la llamada.
http://antelope.tigris.org/nonav/docs/manual/bk03ch20.html

Código de ejemplo 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> 
+0

Gracias. Fue el problema. ¿Cómo implementas ese comportamiento de una manera diferente? Me refiero a que me gustaría dividir la lógica de un objetivo en subtargets – alem0lars

+0

Además, puedes probar la tarea 'AntCallBack' del paquete Ant-Contrib: http://ant-contrib.sourceforge.net/tasks/tasks/index.html – kevinarpe

0

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> 

Rodeé esto con una etiqueta de proyecto y moví la instrucción de eco a "A". Mi salida dice

B: 
A: 
    [echo] myvalue 
BUILD SUCCESSFUL 
+2

Eso es 'no' lo que OP quiere. Quiere definir la propiedad en el objetivo A y hacer eco en el objetivo B. Aquí la define en A y la repite en A. – SOUser

+0

Esto no resuelve el problema – alem0lars

+0

Gracias por aclarar la pregunta. – rajah9

0

@ alem0lars, ya que dijo que le gustaría para subdividir un objetivo, permítanme ofrecer una solución diferente (que, lamentablemente, no responde a sus 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.

salida será

aTgt: 
    [echo] "In aTgt doing a build" 
bTgt: 
    [echo] "In bTgt doing a build" 
deps: 
BUILD SUCCESSFUL 
4

En lugar de utilizar <antcall>, ¿por qué no tiene destino B dependen de destino Un?

<target name="B" depends="A"> 
    <echo>${myprop}</echo> 
</target> 
<target name="A"> 
    <property name="myprop" value="myvalue" /> 
</target> 
9

Otro enfoque es refaccionar sus objetivos en macros. Está intentando 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 puedo componerla más fácilmente en macros más complicadas. Luego escribo objetivos de envoltura simple para los puntos de entrada de la línea de comandos que necesito.

+2

Este es el mejor enfoque. Las propiedades de las hormigas no son variables, son inmutables. un anticata en el mismo build.xml _always_ huele mal. – thekbb

Cuestiones relacionadas