Я новичок в ant и расширил существующий файл сборки a.xml:

Я создал дополнительный файл сборки b.xml, который импортируется a.xml. Целевой объект example, определенный в b.xml, предоставляет новую (необязательную) функцию при построении с помощью ant, для которой требуется свойство ${version}. Свойство ${version} создается / предоставляется целью determine.version в a.xml.

Чтобы гарантировать существование / доступ ${version} в b.xml, я добавил параметр depends="determine.version" к целевому example в b.xml. Таким образом, я добавил зависимость к неразрешимой цели при запуске b.xml исключительно (что не предназначено) .

Вопрос:

Мне не нравится это решение, и я хочу спросить, есть ли более чистый способ обеспечить существование и доступ ${version} в b.xml.

A.xml


<project name="a" basedir="." >
   ...
   <target name="determine.version">
      ...
   </target>

   ... 

   <import file="b.xml" as="b" />
</project>

B.xml

<project name="b" basedir="." >
   ...
   <target name="example" depends="determine.version">
      ...
      do s.th. with ${version}
      ...
   </target>

</project>

Я благодарен за любой совет, рекомендацию или комментарий по этому поводу!

0
Max M 11 Фев 2021 в 10:28

1 ответ

Лучший ответ

Если вы хотите сохранить b.xml таким образом, чтобы он работал при использовании напрямую / независимо от a.xml, одним из решений может быть установка b.xml с его собственной целью determine.version и переопределение этой цели в файле. xml.

b.xml потребуется:

<target name="determine.version">
  ... does nothing or whatever is needed to satisfy b's "example" target when a.xml not used
</target>

Затем a.xml может переопределить determine.version и зависеть от реализации по умолчанию в b.xml, поэтому он вызывается в правильной позиции при оценке цели b.xml "пример". Способ ссылаться на зависимость импорта состоит в том, чтобы указать {buildfile}.targetname - в данном случае b.determine.version - предполагая, что вы хотите, чтобы выполнялись оба элемента a + b determine.version:

<target name="determine.version" depends="b.determine.version">
  ...
</target>

Или же

Вышеупомянутая установка неудобна тем, что имена, используемые в a / b xml, связаны. Вместо этого вы можете попробовать extension-point в сборках муравьев, которые заставляют имена в a зависеть от b, но не в обоих направлениях. Для этого потребуется что-то вроде этого:

b.xml - B объявляет точку расширения, на которую ссылается "example":

<extension-point name="setupversion" />
<target name="example" depends="setupversion">

a.xml - A объявляет цель (которую не нужно называть define.version), которая будет выполняться перед всеми целями, зависящими от "setupversion".

<import file="b.xml" />
<target name="determine.version" extensionOf="setupversion">
1
DuncG 11 Фев 2021 в 14:58