Ant antcall цель, которая определяет свойство - PullRequest
19 голосов
/ 11 марта 2011

В Ant я хочу определить цель (называемую A), которая определяет свойство, и antcall его от другой цели (называемой B).Я хочу, чтобы цель B после вызова цели A могла получить доступ к свойству, определенному в цели A.

Например:

<target name="B">
    <antcall target="A" inheritAll="true" inheritRefs="true" />
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>

Однако это нене работает и <echo>${myprop}</echo> не печатает myvalue (я думаю, потому что свойство myprop не определено в B).

Есть ли способ сделать это?

Ответы [ 5 ]

11 голосов
/ 11 марта 2011

Согласно FAQ по 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.

В этом отношении невозможно делать то, что вы хотите, с помощью antcall.

========== изменить ===========

Попробуйте antcallback: AntCallBack идентичен стандартной задаче 'antcall', за исключением того, что он позволяет свойствам, установленным в вызываемой цели, быть доступными в вызывающей цели.
http://antelope.tigris.org/nonav/docs/manual/bk03ch20.html

Пример кода, вставленный со страницы выше:

    <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>
9 голосов
/ 14 марта 2011

Другой подход заключается в рефакторинге ваших целей в макросы.Вы пытаетесь использовать цели как функции, и они просто не предназначены для такого использования.Обычно я пишу основную часть своей логики в виде макросов, чтобы мне было проще составлять ее в более сложные макросы.Затем я пишу простые цели-оболочки для нужных мне точек входа командной строки.

5 голосов
/ 12 марта 2011

Вместо использования <antcall>, , почему бы просто не иметь цель B, зависящую от цели A ?

<target name="B" depends="A">
    <echo>${myprop}</echo>
</target>
<target name="A">
    <property name="myprop" value="myvalue" />
</target>
0 голосов
/ 11 марта 2011

@ alem0lars, поскольку вы сказали, что хотите подразделить цель, позвольте мне предложить другое решение (к сожалению, оно не отвечает на ваш первоначальный вопрос).

<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>

Это делит сборку на aTgt и bTgt.

Выход будет

aTgt:
     [echo] "In aTgt doing a build"
bTgt:
     [echo] "In bTgt doing a build"
deps:
BUILD SUCCESSFUL
0 голосов
/ 11 марта 2011

Я думаю, вы хотите использовать параметр.

<project default="B">
<target name="B">
    <antcall target="A">
      <param name="myprop" value="myvalue"/>
    </antcall>

</target>
<target name="A">
    <echo>${myprop}</echo>
</target>
</project>

Я окружил это тегом проекта и переместил оператор echo в «A». Мой вывод говорит

B:
A:
     [echo] myvalue
BUILD SUCCESSFUL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...