Идиомы для поддержки родительской сборки с использованием точек расширения Ant 1.8 - PullRequest
4 голосов
/ 14 февраля 2011

Пожалуйста, имейте в виду, что следующие примеры значительно упрощены по сравнению с нашей очень сложной структурой сборки.

Предположим, у меня есть сборка, которая использует все преимущества точек расширения 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 идиому, шаблон, руководство по использованию, инструкции или что-нибудь еще, чтобы помочь мне решить эту дилемму?

1 Ответ

0 голосов
/ 07 декабря 2012

Тем не менее, это не работает для меня, потому что мы заканчиваем сначала спуском иерархии в ширину, а не глубиной: если мы развернем на верхнем уровне иерархии, мы сначала компилируем в каждом проекте затем мы делаем тестирование, затем делаем пакет, затем мы делаем развертывание. Мне нужно сделать все шаги для развертывания в child1, затем все шаги в child2 и т. Д.

Действительно? Если вы вызываете 'ant parent: deploy' из корня, НЕ выполняется ли сначала полное развертывание проекта child1, прежде чем вызывать его на child2?

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