Вложенный импорт в Ant - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть система сборки, в которой многие компоненты одинаковы, поэтому я изменил ее, чтобы использовать «импорт» в общем файле для большинства задач сборки.Затем система сборки также должна создавать любые модули, от которых она зависит.Итак, у меня примерно ...

common.xml
project1.xml
  - import common.xml
project2.xml
  - include project1.xml
  - import common.xml

В common.xml есть цель с именем build.Я хочу, чтобы project2 мог включать project1 и использовать точку расширения, чтобы установить зависимость от цели сборки.Но по какой-то причине он не распознает, что у project1 есть цель сборки.Если я изменю его, чтобы он зависел от цели, определенной в project1.xml, то это нормально.Но мне нужно иметь возможность указать цель, которая находится в common.xml.

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

Нет ant-contrib.Раньше проект использовал это, но я пытаюсь избавиться от него, чтобы у нас не было ужасного процедурного кода для сборки системы.У проекта есть много случаев зависимостей, которые выглядят как ромб, и правильный график зависимостей (тот, который генерирует муравей автоматически) очень помог бы.

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

<project name="top" default="build">
  <include file="mid.xml" as="mid" />
  <target name="build">
    <antcall target="mid.build" />
  </target>
</project>

<project name="mid" default="build">
  <!-- <target name="build"> -->
  <!--   <echo message="build mid" /> -->
  <!-- </target> -->
  <import file="common.xml" />
</project>

<project name="common">
  <target name="build">
    <echo message="build common" />
  </target>
</project>

Это не удалось.top.xml не может найти mid.build.Когда я запускаю ant -p для отображения списка целей, он показывает build и common.build.Поэтому я попытался добавить файл сборки mid.xml и получил его для правильной сборки.Теперь единственная проблема заключается в том, что если я раскомментирую приведенный выше XML для mid, чтобы определить собственный шаг сборки, он будет перезаписан при импорте и проигнорирован.Таким образом, он становится [build, common.build] вместо [build, mid.build].

1 Ответ

2 голосов
/ 08 февраля 2011

Попробуйте вместо этого использовать задачу include , в частности на уровне mid.xml:

<project name="mid" default="build">
  <include file="common.xml" />
</project>

Задачи «include» и «import» имеют альтернативные подходы кпереопределение задачи.См. 'Чем отличается от ?' в документах по задачам include :

Краткая версия: используйте импорт, есливы намерены переопределить цель, в противном случае используйте include

Похоже, вы хотите, чтобы общая цель «build» была выбрана, если она не определена в середине.Проблема заключается в том, что в задаче import импортируемая версия (то есть common.xml) переопределяет версию в mid.xml.Поскольку «include» не допускает переопределений, то, что определено в вызывающей программе (mid.xml), не переопределяется при чтении common.xml.

Пример: для вышеуказанного mid.xml, ant -f top.xml отчетов:

build:

mid.build:
     [echo] build common

С переопределением цели build в mid.xml:

<project default="build" name="mid">
  <target name="build">
    <echo message="build mid" />
  </target>
  <include file="common.xml" />
</project>

результат будет:

build:

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