Каковы хорошие способы распространения общего файла ant для включения в сборки? - PullRequest
6 голосов
/ 26 февраля 2011

Я работаю в группе, в которой мы производим много небольших приложений, и использую ANT для наших процессов сборки.

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

<import file="${env.MAPPED_DRIVE}/common_directive.xml">

. Должен быть лучший способ распространения общего файла ant для включения во многие проекты без привязки диска.Есть ли у вас другие предложения?

Import - это директива верхнего уровня, что означает, что она не будет работать внутри цели.Поэтому я не могу просто создать цель, которая загружает файл, а затем импортировать его.

Ответы [ 3 ]

4 голосов
/ 26 февраля 2011

Если вы используете ANT 1.8+, вы можете указать URL и разместить общий фрагмент сборки на веб-сайте.

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

2 голосов
/ 02 марта 2011

Я разработал решение, которое создает jar-файл, содержащий наши многократно используемые сценарии сборки в каталоге, например com / example / ant / sharedbuild, который можно импортировать в Ant 1.8:

<project>
    <import>
        <javaresource name="com/example/ant/sharedbuild/java.xml">
            <classpath location="../../../../target/ant-shared-build.jar" />
        </javaresource>
    </import>
</project>

В моем случае это определяет все «публичные» цели для проекта для сборки на основе Java.

Синтаксис немного многословен, особенно когда я добавляю все больше и больше включаемых файлов (скажем, чтобы добавитьвозможность создания OSGi jar).Добавив файл antlib.xml, который содержит комбинацию macrodef и scriptdef, в файл jar (в том же каталоге, что и общие сценарии сборки), файл сборки теперь может выглядеть следующим образом (и теперь также создается пакет jar OSGi):

<project xmlns:build="antlib:com.example.ant.sharedbuild">
    <taskdef uri="antlib:com.example.ant.sharedbuild"
             classpath="../../../../target/ant-shared-build.jar" />
    <build:build using="java, jar, bundle" />
</project>

К сожалению, я не могу поделиться кодом в macrodef или scriptdef, но на самом деле это не сложно: маленький javascript для анализа атрибута using и зацикливания каждого из них, получения имени файла изи импортирую.

Я ссылаюсь на файл jar в фиксированном месте (относительно моего проекта) на моем жестком диске.Я думаю, что мы можем сделать лучше.В идеале я хотел бы получить (версионный!) Файл jar из центрального расположения.Так как мы уже используем Ivy (с HTTP-репозиторием), мы можем опубликовать там файл jar (опять же, с версией) и получить его прямо оттуда:

<project xmlns:build="antlib:com.example.ant.sharedbuild">
    <property name="ant.shared.build.jar.file"
              location="${user.home}/ant/ant-shared-build-1.5.3.jar" />
    <get src="http://repo.example.com/.../ant-shared-build-1.5.3.jar"
         dest="${ant.shared.build.jar.file}"
         skipexisting="true" />
    <taskdef uri="antlib:com.example.ant.sharedbuild"
             classpath="${ant.shared.build.jar.file}" />
    <build:build using="java, jar, bundle" />
</project>

Есть некоторые проблемы с этим:

  1. Он снова становится многословным.
  2. Многословие повторяется для каждого build.xml.
  3. Существует много повторяющихся шаблонов, особенно номер версии.

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

<project xmlns:build="antlib:com.example.ant.sharedbuild">
    <include file="bootstrap.xml" />
    <build:build using="java, jar, bundle" />
</project>

Каждый файл bootstrap.xml, как минимум, включает в себя родительский файл bootstrap.xml:

<project>
    <include file="../bootstrap.xml" />
</project>

Bootstrap.xml верхнего уровня.(корень), затем выполняет работу по получению jar-файла и созданию пользовательских задач, как указано выше:

<project>
    <property name="ant.shared.build.version"
              value="1.5.3" />
    <property name="ant.shared.build.jar.filename"
              value="ant-shared-build-${ant.shared.build.version}.jar" />
    <property name="ant.shared.build.jar.file"
              location="${user.home}/ant/${ant.shared.build.jar.filename}" />
    <get src="http://repo.example.com/.../${ant.shared.build.jar.filename}"
         dest="${ant.shared.build.jar.file}"
         skipexisting="true" />
    <taskdef uri="antlib:com.example.ant.sharedbuild"
             classpath="${ant.shared.build.jar.file}" />
</project>

Хотя это не имеет прямого отношения к вопросу, на самом деле я перерабатываю macrodef и scriptdef впользовательская задача муравья, потому что я хочу иметь возможность поддерживать синтаксис, который выглядит следующим образом:

<project xmlns:build="antlib:com.example.ant.sharedbuild">
    <include file="bootstrap.xml" />
    <build:build>
        <using>
            <java />
            <bundle>
                <manifest>
                    Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
                    Bundle-Activator: com.example.time.impl.Activator
                </manifest>
            </bundle>
        </using>
    </build:build>
</project>

Я должен отметить, что просто создание распространяемой сборки не означает, что она будет полезна.Вам все еще нужно потратить время и усилия на создание связной, модульной, последовательной реализации в соответствии с дизайном схожих характеристик.Это более важно, так как вам нужно обмениваться сценариями между проектами, командами, организационными границами и т. Д.

В заключение, создав файл JAR с номером версии, который можно распространять независимо от конкретногорасположение файла или инструмент SCM, мы можем получить реальные общие, но воспроизводимые сборки.

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

Комментарий Доминика Митчелла о том, что ссылка на URL является плохой идеей, если вы хотите повторяющиеся сборки, заставил меня задуматься ...

Другое решение, которое следует рассмотреть, если вы используете SVN для контроля версий, - это создать Определение внешних SVN , которое указывает на common_directive.xml.

Затем просто используйте относительный путь для ссылки на файл импорта ANT.

Иногда полезно построить рабочая копия, которая сделана из количество различных проверок. Для Например, вы можете хотеть разные подкаталоги прийти из разных места в хранилище или, возможно, из разных репозиториев в целом. Вы могли бы, конечно, настроить такой сценарий вручную - используя svn checkout для создания своего рода вложенного структура рабочей копии, которую вы пытаетесь достигать. Но если этот макет важно для всех, кто использует ваш репозиторий, любой другой пользователь будет нуждаться выполнить ту же проверку операции, которые вы сделали.

К счастью, Subversion предоставляет поддержка внешних определений. Внешнее определение является отображением локальный каталог с URL - и в идеале конкретная версия - версионной каталог. В Subversion вы объявляете внешние определения в группах, использующих svn:externals свойство. Вы можете создать или изменить это свойство, используя svn propset или svn propedit (см. раздел под названием « Манипулирование Свойства »). Может быть установлен на любой версионный каталог и его значение описывает как внешний репозиторий расположение и каталог на стороне клиента к которому это место должно быть проверено.

Удобство svn:externals свойство заключается в том, что, как только он установлен на версионный каталог, все кто проверяет рабочую копию с этим каталог также получает выгоду от внешнее определение. Другими словами, однажды один человек приложил усилие к определить вложенную рабочую копию структура, никто не должен беспокоить - Subversion, после проверки из оригинальной рабочей копии, автоматически также проверить внешние рабочие копии.

...