Передача свойств, определенных внутри цели antcall, обратно к вызывающей цели

Я новичок в Ant, но я испытал довольно неплохой шаблон для создания общих Ant целей, которые должны быть вызваны с задачей antcall с различными параметрами.

Мой пример - цель компиляции, которая объединяет несколько систем, используя сложную команду сборки, которая немного отличается для каждой системы. Используя шаблон, описанный выше, можно не создавать код вставки для этой команды компиляции.

Моя проблема здесь в том, что я не знаю, как передать возвращаемое значение (например, возвращаемое значение компилятора) обратно в целевую, которое называется задачей antcall. Итак, мой подход патологичен, и просто невозможно вернуть значение из задачи antcall или вы знаете какое-либо обходное решение?

Спасибо,

Ответы

Ответ 1

Используйте antcallback из ant -contrib jar вместо antcall

<target name="testCallback">
    <antcallback target="capitalize2" return="myKey">
    </antcallback>
    <echo>a = ${myKey}</echo>
</target>

<target name="capitalize2">
    <property name="myKey" value="it works"/> 
</target>

Вывод:

testCallback:

capitalize2:
     [echo] a = it works

BUILD SUCCESSFUL

Ответ 2

Один из подходов заключается в том, чтобы записать свойство в временный файл, используя задачу "echo file =...." или PropertyFile. Затем прочитайте свойство, где требуется. Kludge, но работает.

Ответ 3

Ant все задачи о том, что происходит, происходит побочный эффект. Поэтому, пытаясь программировать с точки зрения функций (материал входит, материал выходит), будет грязным.

Это означает, что вы можете создать имя свойства для каждого вызова и сохранить значение результата в этом свойстве. Вам нужно будет пройти в indentifier, чтобы вы не пытались создать копии того же свойства. Что-то вроде этого:

<target name="default">
  <property name="key" value="world"/>
  <antcall target="doSomethingElse">
     <param name="param1" value="${key}"/>
  </antcall>
  <echo>${result-${key}}</echo>
</target>
<target name="doSomethingElse">
   <property name="hello-${param1}" value="it works?"/>
</target>

Но я считаю, что более типичный подход - вместо antcalls - заключается в использовании макросов. http://ant.apache.org/manual/Tasks/macrodef.html

Ответ 4

Antcall может использоваться из задачи ant -contrib jar.