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

时间:2012-02-15 14:16:26

标签: java git ant tfs ivy

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

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

2 个答案:

答案 0 :(得分:8)

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

然而....

使用packager resolver,ivy在技术上可以下载和编译依赖项。这个非常聪明的解析器旨在采用第三方zip或tar存档,然后使用ANT提取所需的工件。

下面是我从github leachim6 repository下载“hello world”源代码的示例,并将其动态编译为名为“hello-world.jar”的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>

声明对“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>

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

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

  • resourceCache :这是存储下载档案的地方。
  • buildRoot :这是下载的存档解压缩并执行操作的地方。
  • 受限:通常情况下,不允许打包者运行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>

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

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

最终说明:

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

答案 1 :(得分:2)

这要么是不可能的,要么是需要严重的黑客攻击。 Ivy旨在下载已编译的依赖项。使用任何现代构建管理工具(Maven,Ivy,Gradle等),您最好尽可能遵守惯例。你越远离这条经过良好打击的道路,你最终会给自己带来的痛苦就越大。

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