Я использую apache ant следующим образом:
У меня есть проекты P1, P2, P3.Некоторые из этих проектов имеют модули, скажем, у P2 есть M1, M2 и т. Д. Все проекты имеют свой собственный скрипт сборки ant, и все они должны реализовывать набор предопределенных целей (build, dist и т. Д.), Сценарии ожидают некоторых свойств.быть определенным при вызове.let say (build.dir.base)
Модули имеют схожую структуру, поэтому у каждого модуля есть свой собственный файл сборки, который реализует предопределенный набор целей и ожидает установки некоторых свойств.(скажем, build.dir.base - так же, как и для проектов)
У меня также есть глобальный ant-скрипт, который создает все проекты (или подмножество)
В коде, который будет выглядеть следующим образом:
build-all.xml:
<project name="x">
<property name="build.dir.base" location="system.build.base" />
<target name="build">
<echo message="build.dir.base as defined for build-all.xml=${build.dir.base}" />
<subant antfile="build.xml" target="build" inheritAll="false" inheritRefs="false">
<dirset dir="${system.base}" includes="${project-list}" />
<property name="build.dir.base" location="${build.dir.base}" />
</subant>
</target>
</project>
build.xml (по одному на каждый проект с модулями, subant
, если в проекте нет модулей):
<project name="y">
<property name="build.dir" location="${basedir}/build" />
<target name="build">
<echo message="build.dir.base as defined for project=${build.dir.base}" />
<subant antfile="build.xml" target="build" inheritAll="false" inheritRefs="false">
<dirset dir="project.base" includes="${module-list}" />
<property name="build.dir.base" location="${build.dir.base}/${name}" />
</subant>
</target>
</project>
А для проектов, которые имеют модули: build.xml (для модуля):
<project name="z">
<property name="build.dir.base" location="build.dir.base" />
<target name="build">
<echo message="build.dir.base as defined for module=${build.dir.base}" />
</target>
</project>
Эта структура позволяет создавать проекты независимо, также модули могут создаваться независимо, или вся система может бытьпостроен с использованием build-all.xml.Кроме того, конечный продукт имеет следующую структуру:
- $ {system.build.base} / P1,
- $ {system.build.base} / P2 / M1
- $ {system.build.base} / P2 / M2
и т. Д.
Однако, поскольку ant> = 1.8.0, это больше невозможно.Причина в том, что <property name="build.dir.base" location="${basedir}/build" />
в build-all.xml имеет приоритет над <property name="build.dir.base" location="${build.dir.base}/${name}" />
в build.xml (сборка для проектов).Таким образом, назначение «подмодулей» проекта находится в ${system.build.base}/M1
вместо ${system.build.base}/P2/M1
Это объясняется Свойства, определенные в командной строке, не могут быть переопределены вложенными элементами. Начиная с Ant 1.8.0.то же самое верно для вложенных структур задач: если файл сборки A вызывает B через задачу, устанавливающую свойство с вложенным элементом, а B содержит задачи, вызывающие C, C увидит значение, установленное в A, даже если B использовал вложенныйтакже элемент.
Невозможно переопределить свойство для subant
, если некоторые из родителей также определили это свойство.Это серьезно, так как сборка должна учитывать свойства, которые родитель использовал по какой-то не связанной причине.
Есть ли обходной путь для этого несовместимого изменения в поведении?Поскольку моя система сборки сильно зависит от того факта, что <subant inheritAll="false" inheritRefs="false">
будет выполнять exec без загрязнения суб-сборок.