适用于Git或TFS的常春藤定制解析器

E-r*_*ich 5 java git ant tfs ivy

我对Ivy很新,所以也许有一种我无法在文档中找到的直接方式或者我正在寻找的东西是不可能的,但是这里有.我希望能够指定源代码位于使用不同协议的本地和/或远程服务器上的依赖项.

具体来说,我有一些存储在本地网络TFS服务器上的项目依赖项,以及存储在远程Git服务器上的其他项目依赖项(更准确地说www.github.com).是否有可能让Ivy下载源代码并构建一个jar文件,然后将其用作依赖项?如果是这样,怎么样?

Mar*_*nor 8

我会回应@dbyrne的答案,即常春藤旨在管理二进制预编译的依赖项.您最好拥有像Nexus这样的本地存储库管理器来存储项目的第三方依赖项.

然而....

使用打包程序解析器,常春藤下载和编译依赖项在技术上是可行的.这个非常聪明的解析器旨在采用第三方zip或tar存档,然后使用ANT提取所需的工件.

下面是我从github leachim6存储库下载"hello world"源码的示例,并将其编译成一个名为"hello-world.jar"的jar.

项目文件

|-- build.xml
|-- ivysettings.xml
|-- ivy.xml
`-- repository
    `-- leachim6
        `-- hello-world
            `-- 1.0
                `-- packager.xml
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

声明对"hello-world"工件的1.0版本的依赖性.在这个级别,常春藤将被从某种第三方存储库中获取一个罐子.

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>
Run Code Online (Sandbox Code Playgroud)

这是我们定义要使用的存储库(或常春藤说话中的解析器)的地方.默认情况下,ivy从Maven Central检索,但是,我们还指定应使用打包程序解析程序检索"hello-world"模块.

打包器属性需要进一步解释:

  • resourceCache:这是存储下载的存档的位置.
  • buildRoot:这是下载的存档被解压缩并执行操作的地方.
  • restricted:通常不允许打包者运行javac和delete等ANT命令.如果打包文件位于远程位置,则认为是危险的.

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>
Run Code Online (Sandbox Code Playgroud)

这是我们放置创建"hello-world.jar"工件的ANT脚本逻辑的地方.

此文件用于生成ANT脚本,该脚本下载远程工件(使用它的校验和以确保安全性)并提取或在我们的案例中编译将返回到常春藤任务的工件.

最后的说明:

  • 这是一个人为的例子.在现实生活中,您会发现编译逻辑通常比简单调用javac更复杂.
  • 一旦github项目发布另一个版本,此示例将中断.(这个样本没有发布标签)


dby*_*rne 2

这要么是不可能的,要么需要严重的黑客攻击。Ivy 旨在下载已编译的依赖项。使用任何现代构建管理工具(Maven、Ivy、Gradle 等),尽可能遵守约定总是更好。你离正路越远,最终给自己带来的痛苦就越多。

为什么需要动态下载并编译代码?如果您只想将源代码用于调试目的,这个问题可能会有所帮助。如果原因是因为您总是想要检查到 VCS 中的任何内容的绝对前沿版本,那么您最好设置某种连续构建来为您生成工件。