Пожалуйста, имейте в виду, что следующие примеры значительно упрощены по сравнению с нашей очень сложной структурой сборки.
Предположим, у меня есть сборка, которая использует все преимущества точек расширения Ant 1.8, так что у меня есть общий наборцели определены как:
<?xml version="1.0" encoding="utf-8"?>
<project name="common-targets">
<extension-point name="compile" />
<extension-point name="test" depends="compile" />
<extension-point name="package" depends="test" />
<extension-point name="deploy" depends="package" />
</project>
Каждый из более поздних этапов зависит от более раннего этапа, создавая цепочку четко определенных шагов, в которые могут вносить вклад другие части сборки;например, шаг компиляции может быть определен как:
<?xml version="1.0" encoding="utf-8"?>
<project name="compile">
<import file="common-targets.xml" />
<target name="compile:compile" extensionOf="compile">
<echo message="Compiling..." />
</target>
</project>
, в то время как тест может быть:
<?xml version="1.0" encoding="utf-8"?>
<project name="test">
<import file="common-targets.xml" />
<target name="test:test" extensionOf="test">
<echo message="Testing..." />
</target>
</project>
и так далее.Я могу комбинировать их различными способами, и для обсуждения, скажем, они находятся в одном файле сборки с именем default-lifecycle.xml:
<?xml version="1.0" encoding="utf-8"?>
<project name="default-lifecycle">
<import file="compile.xml" />
<import file="test.xml" />
<import file="package.xml" />
<import file="deploy.xml" />
</project>
Проект, называемый child1, может использовать этонапример:
<?xml version="1.0" encoding="utf-8"?>
<project name="child1">
<import file="../scripts/default-lifecycle.xml" />
</project>
в то время как одноранговый узел child1 (умно) с именем child2 будет таким же:
<?xml version="1.0" encoding="utf-8"?>
<project name="child2">
<import file="../scripts/default-lifecycle.xml" />
</project>
Итак, я достиг похвальной цели создания многоразовых сборок, которые могутразделить на несколько проектов.Более того, каждая сборка может быть настроена путем добавления целей, которые добавляют к четко определенным точкам расширения, делая вещи очень гибкими, когда это необходимо.
Однако у меня возникают проблемы с поиском лучшего способа созданияиерархическая родительская / дочерняя сборка, такая, что у меня есть структура каталогов, такая как:
.-+
|
+-build.xml
+-child1
|
+-build.xml
+-child2
|
+-build.xml
+-scripts
, так что я могу вызвать, скажем, цель установки внутри сборки верхнего уровня и сделать так, чтобы она выполняла цель установки вкаждый из детей.
ИМХО, в идеале я бы сделал это, если бы родительская сборка импортировала общие цели и привязывала цель к каждой из общих целей, например:
<?xml version="1.0" encoding="utf-8"?>
<project name="parent">
<import file="common-targets.xml" />
<target name="parent:compile" depends="parent:init-build-path" extensionOf="compile">
<subant target="compile" buildpathref="parent..build-path" />
</target>
<target name="parent:test" depends="parent:init-build-path" extensionOf="test">
<subant target="test" buildpathref="parent..build-path" />
</target>
<target name="parent:package" depends="parent:init-build-path" extensionOf="package">
<subant target="package" buildpathref="parent..build-path" />
</target>
<target name="parent:deploy" depends="parent:init-build-path" extensionOf="deploy">
<subant target="deploy" buildpathref="parent..build-path" />
</target>
<target name="parent:init-build-path">
<path id="parent..build-path">
<fileset dir="." includes="**/build.xml" excludes="build.xml" />
</path>
<echo message="Build order is ${toString:parent..build-path}" />
</target>
</project>
Однако, это не работает для меня, потому что мы заканчиваем сначала спуском иерархии в ширину, а не в глубину: если мы развернем на верхнем уровне иерархии, мы сначала компилируем в каждом проекте, затеммы делаем тестирование, затем делаем пакет, затем мы делаем развертывание.Мне нужно, чтобы он выполнил все шаги для развертывания в child1, затем все шаги в child2 и т. Д.
Что бы сработало, если бы забыли использовать точки расширения в родительской сборке и просто определить каждую цель напрямую, как это:
<?xml version="1.0" encoding="utf-8"?>
<project name="parent">
<target name="compile" depends="parent:init-build-path">
<subant target="compile" buildpathref="parent..build-path" />
</target>
<target name="test" depends="parent:init-build-path">
<subant target="test" buildpathref="parent..build-path" />
</target>
<target name="package" depends="parent:init-build-path">
<subant target="package" buildpathref="parent..build-path" />
</target>
<target name="deploy" depends="parent:init-build-path">
<subant target="deploy" buildpathref="parent..build-path" />
</target>
<target name="parent:init-build-path">
<path id="parent..build-path">
<fileset dir="." includes="**/build.xml" excludes="build.xml" />
</path>
<echo message="Build order is ${toString:parent..build-path}" />
</target>
</project>
Тем не менее, теперь мои родительские сборки не имеют механизма точек расширения, где их можно легко улучшить без переопределения целей.
Я слишком много думаю?Придумало ли сообщество Ant идиому, шаблон, руководство по использованию, инструкции или что-нибудь еще, чтобы помочь мне решить эту дилемму?