Как я могу наилучшим образом разделить цели Ant между проектами? - PullRequest
12 голосов
/ 02 декабря 2009

Существует ли общепринятый способ разделения Ant целей между проектами? В настоящее время у меня есть решение, но оно немного не элегантно. Вот что я делаю до сих пор.

У меня есть файл с именем ivy-tasks.xml, размещенный на сервере в нашей сети. Этот файл содержит, среди прочих целей, типовые задачи для управления зависимостями проекта с помощью Ivy . Например:

<project name="ant-ivy-tasks" default="init-ivy"
         xmlns:ivy="antlib:org.apache.ivy.ant">
  ...
  <target name="ivy-download" unless="skip.ivy.download">
    <mkdir dir="${ivy.jar.dir}"/>
    <echo message="Installing ivy..."/>
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
         dest="${ivy.jar.file}" usetimestamp="true"/>
  </target>

  <target name="ivy-init" depends="ivy-download"
          description="-> Defines ivy tasks and loads global settings">
    <path id="ivy.lib.path">
      <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
    </path>
    <taskdef resource="org/apache/ivy/ant/antlib.xml"
             uri="antlib:org.apache.ivy.ant"
             classpathref="ivy.lib.path"/>
    <ivy:settings url="http://myserver/ivy/settings/ivysettings-user.xml"/>
  </target>
  ...
</project>

Причина размещения этого файла в том, что я не хочу:

  • Проверяйте файл в каждом проекте, который нуждается в этом - это приведет к дублированию, что усложнит поддержание целей.
  • Мой build.xml зависит от извлечения проекта из системы контроля версий - это позволит сборке иметь больше XML на верхнем уровне только для доступа к файлу.

То, что я делаю с этим файлом в build.xmls моих проектов, выглядит следующим образом:

<property name="download.dir" location="download"/>
<mkdir dir="${download.dir}"/>
<echo message="Downloading import files to ${download.dir}"/>

<get src="http://myserver/ivy/ivy-tasks.xml" dest="${download.dir}/ivy-tasks.xml" usetimestamp="true"/>
<import file="${download.dir}/ivy-tasks.xml"/>

«Грязная» часть этого заключается в том, что я должен выполнить вышеуказанные шаги вне цели , поскольку задача import должна находиться на верхнем уровне. Кроме того, мне все еще нужно включить этот XML во все файлы build.xml, которые в нем нуждаются (т.е. все еще есть некоторое количество дубликатов).

Кроме того, могут быть дополнительные ситуации, когда у меня могут быть общие (не плющевые) задачи, которые я хотел бы импортировать. Если бы я выполнял эти задачи с помощью управления зависимостями Айви, у меня все равно были бы проблемы, поскольку к тому времени, как я бы разрешил зависимости, я должен был бы быть внутри цели в моем build.xml и не мог импортировать (из-за к указанному выше ограничению).

Есть ли лучшее решение для того, чего я пытаюсь достичь?

Ответы [ 4 ]

7 голосов
/ 07 января 2011

Если вы используете ANT 1.8+, вы можете просто импортировать build.xml прямо из расположенного на хосте расположения.

http://ant.apache.org/manual/Tasks/import.html

Начиная с Ant 1.8.0 задача также может импортировать ресурсы из URL или ресурсы classpath (которые являются URL, действительно). Если вам нужно знать, источник текущего файла сборки имеет был файл или URL, вы можете обратиться свойство ant.file.type.projectname (используя тот же пример, что и выше ant.file.type.builddocs), который либо имеют значение "file" или "url".

<!-- importing.xml -->
<project name="importing" basedir="." default="...">
  <import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>
3 голосов
/ 02 декабря 2009

Если вы используете Antlibs , вы можете упаковать их все в файл JAR. Затем просто скопируйте этот файл в каталог ${ANT_HOME}/lib, чтобы использовать их.

1 голос
/ 02 декабря 2009

После некоторого дополнительного поиска возможное решение будет использовать SVN externals для проверки конкретных необходимых файлов, которые могут понадобиться build.xml.

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

0 голосов
/ 30 декабря 2009

Что мы сделали, так это создали проект под названием «bootstrap», который содержит различные xml-файлы, необходимые для других проектов в нашем офисе. Таким образом, чтобы настроить среду разработки, вы запускаете build.xml в bootstrap, который копирует xml-файлы (например, ivy-вещи и другие цели) в известное место, а затем ваши файлы сборки включают в себя:

<import file="${ant.bootstrap.dir}/ant-commons.xml" />
<import file="${ant.bootstrap.dir}/ant-commons-ear.xml" />

Наш загрузочный build.xml содержит это:

<target name="install">
        <fail unless="ant.bootstrap.dir" message="ant.bootstrap.dir ${missing.property.message}"/>
        <copy todir = "${ant.bootstrap.dir}">
            <fileset dir = "src/xml"/>
        </copy>
</target>
...