муравей крупный проект. Как реализовать общую структуру выходных каталогов - include, import и inhertAll = false? - PullRequest
1 голос
/ 19 февраля 2011

У меня есть проект верхнего уровня и много подпроектов под ним.

./build.xml
./datamodel_src/src/build.xml
./datamodel_src/src/module1/build.xml
./datamodel_src/src/module2/build.xml
./infrastructure_src/src/build.xml
./interfaces_src/src/build.xml

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

Таким образом, на выходе будет что-то вроде

c:/sandbox/mainprojectworkarea/subprojectworkarea/lib
c:/sandbox/mainprojectworkarea/subprojectworkarea/docs
c:/sandbox/mainprojectworkarea/subprojectworkarea/classes

В настоящее время я делаю это следующим образом.

Уровень сборки build.xml подобен следующему

<project name="toplevelproject" default="compile" basedir=".">
    <target name="compile">
        <ant dir="infrastructure_src/src" />
        <ant dir="interfaces_src/src " /> <!--does not work-->
        <ant dir="datamodel_src/src inhertAll=false" /> <!--works-->
    </target>
</project>

common.xml как показано ниже

<property environment="env" />
<property name="project.sandbox" value="${env.BUILD_HOME}/sandbox" />
<property name="sandbox"  value="${project.sandbox}" />
<property name="pwa"  value="${sandbox}/pwa" />
<property name="wa"  value="${pwa}/${ant.project.name}" />
<property name="build"  value="${wa}/build" />
<property name="lib"  value="${wa}/lib" />
<property name="docs"  value="${wa}/docs" />
<property name="exports"  value="${wa}/exports" />

Это «включено» во все проекты. Например, «datamodel_src / src / build.xml» выглядит так:

<!DOCTYPE project [
       <!ENTITY common SYSTEM "../../common.xml">
]>

<project name="dmodel" default="compile" basedir=".">
    &common;
    <target name="compile">
        <echo  message="will create lib  in  ${lib}"/>
        <echo  message="will create docs  in  ${docs}"/>
        <ant dir="module1" inheritAll="false"/> <!--works fine-->
        <ant dir="module2" /> <!--does not work -->
    </target>   
</project>

Это работает, когда я устанавливаю значение атрибута attributetill = false для вызовов ant .

Есть ли лучший и правильный способ?

Расширяя ответ Кевина на этот вопрос. При использовании import файл common.xml становится реальным проектом, как показано ниже

<project name="toplevelproject" default="compile" basedir=".">
    <property name="toplevel" value="settotrue"/>
    <target name="compile">
        <ant dir="infrastructure_src/src" />
        <ant dir="interfaces_src/src" />
        <ant dir="datamodel_src/src" />
    </target>
</project>

"datamodel_src / src / build.xml" теперь выглядит так, как показано ниже.

<project name="dmodel" default="compile" basedir=".">
    <import file="../../common.xml" />
    <target name="compile">
        <echo  message="will create classes in  ${build}"/>
        <echo  message="will create lib  in  ${lib}"/>
        <ant dir="module1" inheritAll="false"/> <!--works fine-->
        <ant dir="module2" /> <!--does not work -->
    </target>
</project>

Импорт дает возможность иметь общие цели и т. Д., Поэтому я бы пошел с этим.

1 Ответ

1 голос
/ 19 февраля 2011

Я делаю нечто подобное, используя import , а не include.Все мои общие цели и свойства определены в общем файле сборки, и каждый подпроект просто импортирует общий файл.Когда вы импортируете файл, свойства, определенные в этом файле, становятся относительными к импортируемому файлу.

Поэтому я бы попытался сделать следующее:

  1. Переместить вашу цель компиляции изфайлы сборки вашего подпроекта в ваш common.xml.

  2. Импортируйте ваш файл common.xml в каждый подпроект build.xml.

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