Как я могу наилучшим образом поделиться объектами 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) задачи, которые я бы хотел импортировать. Если бы я должен был выполнять эти задачи с помощью управления зависимостями Ivy, у меня все еще были бы проблемы, так как к тому времени, когда я разрешил зависимости, которые я должен был бы находиться внутри цели в моем файле build.xml и не смог импортировать (из-за к указанному выше ограничению).

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

Ответ 1

Если вы используете 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), которые либо имеют значение "файл" или "url".

<!-- importing.xml -->
<project name="importing" basedir="." default="...">
  <import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

<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>