Ant antcall target, который определяет свойство
В Ant Я хочу определить цель (называемую A
), которая определяет свойство и antcall
из другой цели (называемой B
). Я хочу, чтобы цель B
после antcalling target 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
).
Есть ли способ сделать это?
Ответы
Ответ 1
В соответствии с 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.
В этом отношении невозможно делать то, что вы хотите, используя 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>
Ответ 2
Другой подход - реорганизовать ваши цели в макросы. Вы пытаетесь использовать цели как функции, и они просто не предназначены для использования таким образом. Обычно я пишу основную часть своей логики как макросы, так что я могу легче ее скомпилировать в более сложные макросы. Затем я пишу простые цели-оболочки для точек ввода командной строки, которые мне нужны.
Ответ 3
Вместо использования <antcall>
, почему не только целевой B зависит от цели A?
<target name="B" depends="A">
<echo>${myprop}</echo>
</target>
<target name="A">
<property name="myprop" value="myvalue" />
</target>
Ответ 4
Я думаю, вы хотите использовать параметр.
<project default="B">
<target name="B">
<antcall target="A">
<param name="myprop" value="myvalue"/>
</antcall>
</target>
<target name="A">
<echo>${myprop}</echo>
</target>
</project>
Я окружил это тегом проекта и переместил оператор эха в "A". Мой вывод говорит
B:
A:
[echo] myvalue
BUILD SUCCESSFUL
Ответ 5
@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