Как лучше всего разделить цели Ant между проектами?

Есть ли устоявшийся способ совместного использования целей 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"/>

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

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

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


person Rob Hruska    schedule 01.12.2009    source источник
comment
У меня была такая же трудность. Я просто много копировал и вставлял :).   -  person Jake Toronto    schedule 07.05.2014


Ответы (4)


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

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

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

<!-- importing.xml -->
<project name="importing" basedir="." default="...">
  <import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>
person Mads Hansen    schedule 07.01.2011
comment
Это отлично работает для локальных файлов, но когда я пытаюсь использовать URL-адрес, он все равно пытается разрешить URL-адрес относительно пути моего локального проекта. - person Jake Toronto; 07.05.2014
comment
Чтобы избежать разрешения URL-адреса относительно пути локального проекта, используйте <import><url url="http://path/to/build.xml"/></import> - person bassim; 03.07.2014

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

person Vladimir    schedule 02.12.2009

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

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

person Rob Hruska    schedule 01.12.2009

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

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

Наш файл bootstrap 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>
person slipset    schedule 30.12.2009