Ivo Custom Resolvers для Git или TFS - PullRequest
       6

Ivo Custom Resolvers для Git или TFS

5 голосов
/ 15 февраля 2012

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

В частности, у меня есть некоторые зависимости проекта, которые хранятся в локальной сети TFS сервер, и дополнительные зависимости проекта, хранящиеся на удаленном Git сервере (точнее www.github.com). Можно ли заставить Ivy скачать исходный код и создать файл jar , который затем будет использоваться в качестве зависимости? Если да, то как?

Ответы [ 2 ]

8 голосов
/ 19 февраля 2012

Я бы повторил ответ @ dbyrne о том, что ivy предназначен для управления двоичными предварительно скомпилированными зависимостями.Вам лучше всего иметь локального менеджера репозитория, такого как Nexus для хранения сторонних зависимостей вашего проекта.

Однако ....

Технически возможно, что ivy можетзагрузите и скомпилируйте зависимости, используя распознаватель пакетов .Этот очень умный распознаватель предназначен для того, чтобы брать сторонний zip или tar архив и затем использовать ANT для извлечения необходимого артефакта.

Ниже приведен мой пример, который загружает источник "hello world" из репозитория github leachim6 и на лету компилирует его в jar-файл "hello-world.jar".

Файлы

Файлы проекта

|-- build.xml
|-- ivysettings.xml
|-- ivy.xml
`-- repository
    `-- leachim6
        `-- hello-world
            `-- 1.0
                `-- packager.xml

ivy.xml

<ivy-module version="2.0">
    <info organisation="com.demo" module="packager_demo"/>
    <dependencies>
        <dependency org="leachim6" name="hello-world" rev="1.0"/>
    </dependencies>
</ivy-module>

Объявляет зависимость от версии 1.0 артефакта "hello-world".На этом уровне ожидается, что ivy получит банку из какого-либо стороннего хранилища.

ivysettings.xml

<ivysettings>
    <settings defaultResolver="central"/>
    <resolvers>
        <ibiblio name="central" m2compatible="true"/>
        <packager name="packager" buildRoot="${user.home}/.ivy2/packager/build" resourceCache="${user.home}/.ivy2/packager/cache" preserveBuildDirectories="false" restricted="false">
            <ivy pattern="file:///${ivy.settings.dir}/repository/[organisation]/[module]/[revision]/ivy.xml"/>
            <artifact pattern="file:///${ivy.settings.dir}/repository/[organisation]/[module]/[revision]/packager.xml"/>
        </packager>
    </resolvers>
    <modules>
        <module organisation="leachim6" name="hello-world" resolver="packager"/>
    </modules>
</ivysettings>

Здесь мы определяем хранилища (или средства разрешения в ivy-говорить) будет использоваться.По умолчанию ivy извлекается из Maven Central, однако мы дополнительно указали, что вместо этого модуль «hello-world» должен извлекаться с использованием распознавателя упаковщика.

Атрибуты упаковщика требуют дополнительного пояснения:

  • resourceCache : Здесь хранится загруженный архив.
  • buildRoot : Здесь распаковывается и обрабатывается загруженный архив.
  • ограничено : Обычно упаковщику не разрешается запускать команды ANT, такие как javac и delete.Считается опасным, если файл упаковщика был расположен в удаленном месте.

packager.xml

<packager-module version="1.0">
    <property name="name" value="${ivy.packager.module}"/>
    <property name="version" value="${ivy.packager.revision}"/>

    <resource dest="archive" url="https://github.com/leachim6/hello-world/tarball/master" sha1="7f0e2836d1e8dc6130cca68d29b6f86027b22983" type="tar.gz"/>

    <build>
        <mkdir dir="classes"/>
        <javac srcdir="archive/leachim6-hello-world-38f6567/j" includes="*.java" destdir="classes"/>
        <jar destfile="artifacts/jars/${name}.jar" basedir="classes"/>
    </build>
</packager-module>

Здесь мы размещаем логику сценария ANT, которая создает «привет мир».jar "Артефакт.

Этот файл используется для создания сценария ANT, который загружает удаленный артефакт (используя его контрольную сумму для безопасности) и извлекает или в нашем случае компилирует артефакт, который будет возвращен в задачу ivy..

Заключительные примечания:

  • Это надуманный пример.В реальной жизни вы обнаружите, что логика компиляции обычно более сложна, чем простой вызов javac.
  • Этот пример сломается, как только проект github выпустит другую версию.(Не было тегов выпуска, на которых можно было бы основывать этот образец)
2 голосов
/ 15 февраля 2012

Это либо невозможно, либо потребует серьезных взломов.Ivy предназначен для загрузки уже скомпилированных зависимостей.С любым из современных инструментов управления сборкой (Maven, Ivy, Gradle и т. Д.) Вам всегда лучше придерживаться соглашения, когда это возможно.Чем дальше вы удаляетесь от проторенного пути, тем больше боли вы будете причинять себе в конце.

Зачем вам нужно динамически загружать и компилировать код?Если вы просто хотите, чтобы исходный код был доступен для отладки, этот вопрос может помочь.Если причина в том, что вы всегда хотите иметь абсолютную передовую версию того, что проверено в вашей VCS, вам лучше настроить какую-то непрерывную сборку, которая создаст ваши артефакты для вас.

...