Обходной путь для поведения переопределения вложенного подчиненного свойства (начиная с 1.8.0) - PullRequest
5 голосов
/ 18 февраля 2012

Я использую 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 без загрязнения суб-сборок.

Ответы [ 4 ]

1 голос
/ 05 апреля 2012

https://issues.apache.org/bugzilla/show_bug.cgi?id=49891 также имеет отношение к этому вопросу.

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

1 голос
/ 05 апреля 2012

Не полный ответ, но я обнаружил, что вы можете предотвратить наследование определенных свойств подзадачей, выполнив что-то вроде:

<resources id='aoeu'>
    <intersect>
        <propertyset>
            <propertyref builtin="commandline"/>
        </propertyset>
        <propertyset negate="true">
            <propertyref name="property.not.to.be.inherited"/>
        </propertyset>
    </intersect>
</resources>
<groovy>
    ant.propertyset(id:"snth") {
        project.references["aoeu"].each {
            propertyref(name:"${it.name}")
        }
    }
</groovy>
<subant buildpathref="buildpath">
    <propertyset>
        <propertyset refid="snth"/>
    </propertyset>
    <target name="zvwm"/>
</subant>
0 голосов
/ 16 мая 2016

Вы можете использовать задачу antcontrib var.http://ant -contrib.sourceforge.net / задачи / задачи / variable_task.html

0 голосов
/ 29 сентября 2013

Это не невозможно !! вы можете перезаписать свойства, используя scriptdef self.getProject (). setInheritedProperty (ключ, значение). проверить API

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