【问题标题】:How does ivy:publish work?ivy:publish 是如何工作的?
【发布时间】:2008-12-09 16:18:24
【问题描述】:

我完全不知道蚂蚁任务 ivy:publish 应该如何工作。

我希望我进行正常的构建,这会创建一堆 jar 文件,然后我会将这些 jar 推送到(本地)存储库。

我如何指定从哪里检索构建的 jar,以及这些 jar 将如何在存储库中结束?

更新:

<target name="publish-local" description="--> Publish Local">
    <ivy:retrieve />
    <ivy:publish resolver="local" pubrevision="${release.version}" status="release" update="true" overwrite="true">
        <artifacts pattern="${dist.dir}/[organisation]-[module].[ext]" />
    </ivy:publish>
</target>

这确实有效,我之前没有包含检索。

但是我还是有一些问题,假设我要发布 3 个 jar,openscada-utils.jar,openscada-utils-sources.jar 和 openscada-utils-javadocs.jar 作为 openscada-utils-0.9.2.jar, openscada-utils-0.9.2-sources.jar 和 openscada-utils-0.9.2-javadocs.jar

我并不完全清楚实际名称是如何组合的,以及我可以在哪里指定它们应该获取哪些名称。 (使用上面的片段,jar 总是只调用 utils.jar)。

更新 1:

我让它工作了(有点),但它仍然感觉不对。不知何故,所有教程都关注来自 3rd 方项目的依赖项,但对我来说同样重要的一点是处理项目特定的依赖项。

我有一堆以各种方式相互依赖的子项目。考虑到 ivy:publish 我不清楚如何开始。

  1. 如何处理第一个版本?我对所有子项目都有一个共同的版本号,以表明它们属于一起(比如说 0.9)。因此,第一个修订版应该是 0.9.0,但到目前为止,我的存储库中没有任何项目。如何让 Ivy 分配此修订号。

  2. 在开发过程中我想再次发布构建的文件,目前不更改修订号。

  3. 如果我完成了我的工作,我想将它推送到一个共享存储库(并将修订号从 0.9.0 增加到 0.9.1),推荐的方法是什么?

  4. 1234563我怎样才能利用它来发挥我的优势?

【问题讨论】:

  • 仅供参考,根据this deliver 任务由publish 任务调用。

标签: java ant build-process build-automation ivy


【解决方案1】:

您需要指定“解析器”。比如:

<ivy:publish resolver="local" pubrevision="1.0"/>

它由模式控制。这个page 很好地涵盖了它。看起来您希望自己是:

<artifacts pattern="${dist.dir}/[organisation]-[module]-[revision]-[type].[ext]" />

您需要将这三个 jar 标识为 ivy.xml 文件中的工件。像这样的:

<publications>
    <artifact name="utils"/>
    <artifact name="utils" type="source"/>
    <artifact name="utils" type="javadocs"/>
</publications>

【讨论】:

    【解决方案2】:

    首先你需要一个 ivy.xml 文件。

    <ivy-module version="2.0">
        <info organisation="com.example.code" module="MyProject"
             revision="${project.revision}"/>
        <configurations>
            <conf name="runtime" description="" />
            ... other config elements here...
        </configurations>
    
        <publications defaultconf="runtime">
            <artifact name="MyProject" type="jar" ext="jar" conf="runtime" />
        </publications>
    
        <dependencies>
            ...
        </dependencies>
    </ivy-module>
    

    ivy.xml 中的 info 元素和 Publications 元素允许您 跳过 build.xml 中 ivy 元素的各种属性。

    注意 ivy.xml 中的 ${project.revision}。该属性被赋予了价值 在 build.xml 中,但这似乎工作得很好。然后可以修改 轻松获得所需的任何值(例如,夜间构建与本地构建)。

    这是一个如何设置 build.xml 文件的示例

    <property name="project.revision" value="1.0.0"/>
    
    ...
    
    <target name="ivy">
        <ivy:resolve />
    
        <!-- Possible ivy:report, ivy:retrieve and other
        elements for managing your dependencies go here -->
    
        <ivy:deliver conf="*(public)"/> 
    </target>
    
    <target name="publish" depends="clean, ivy, jar">
        <ivy:publish resolver="local">
            <!-- possible artifacts elements if your artifacts
            are not in standard location -->
        </ivy:publish>
    </target>
    
    ...
    

    【讨论】:

    【解决方案3】:

    您应该先运行&lt;ivy:deliver/&gt; 任务。这将创建一个 ivy.xml 文件,可供 Ivy 存储库使用。

    当您使用&lt;ivy:publish&gt; 时,您可以通过在resolver 参数中指定要发布到哪个存储库。这需要与您的 ivy.settings.xml 文件中的解析器名称相匹配。

    您并没有真正指定工件,而是指定在哪里找到要发布的工件的模式。您可以通过&lt;ivy:publish&gt; 任务上的&lt;artifacts&gt; 子任务来指定它。例如,如果您像我们一样在${basedir}/target/archive 目录下构建所有内容,您可以将其指定为:

    <ivy:publish resolver="public">
       <artifacts path="target/archive/[artifact].[ext]"/>
    </ivy:publish>
    

    如果要更改文件的修订号,可以使用&lt;ivy:publish&gt; 任务的pubrevision 参数。这不会更新 ivy.xml,但会将您的 jars/wars 发布到正确的修订版。我更喜欢使用&lt;ivy:deliver&gt; 任务的pubrevision 参数,让它创建正确的ivy.xml 文件。然后,&lt;ivy:publish&gt; 将使用我的ivy.xml 文件中的修订。

    你不需要做&lt;ivy:retrieve&gt;。毕竟,您正在运行构建以创建新的 jar,它们应该在您的构建中的某个位置。否则,如果您不创建 jar 或 war,您想将什么发布到您的 Ivy 存储库中?而且,您当然不想为了重新发布而检索 Ivy 存储库中已有的内容。


    我的理念一直是发布是一项 CM 任务,不应作为构建过程的一部分来完成。因此,我们不使用&lt;ivy:deliver&gt;&lt;ivy:publish&gt;

    我们使用 Artifactory 作为我们的 Ivy 存储库(和我们的 Maven 存储库)。我们使用Jenkins 作为我们的持续构建服务器。

    我要做的是让开发人员通过&lt;ivy:makepom&gt; 任务从他们的ivy.xml 文件中创建一个pom.xml 文件。这和构建 jars/wars 在 Jenkins 中保存为存档工件。

    当我们对特定构建感到满意并希望它在我们的公共存储库中时,我使用 Jenkins 的提升构建任务将带有 pom.xml 的特定 jar/war 提升到我们的 Artifactory 存储库。我们使用mvn deploy:deploy-file 任务来做到这一点。

    【讨论】:

      【解决方案4】:

      了解 ivy 在这里所做的事情很重要。它不仅仅是将您的工件 jar 复制到 ivy 存储库 - 它还生成相关的“.ivy.xml”文件,这些文件指定每个工件的所有依赖项。

      在幕后,ivy:retrieve 任务实际上也触发了ivy:resolve。当 ivy:resolve 发生时,一个文件被写入本地 ivy 缓存(在 user.home 中的 .ivy 文件夹中),该文件指定解析是如何发生的(需要哪些模块的修订来完成解析。)当@遇到 987654325@,该解析记录将从缓存中检索并用于为您的工件生成 ivy.xml。

      我发现这样做的最大缺陷是要求ivy:resolveivy:publish 任务在由ant 执行时都由同一个类加载器加载。确保发生这种情况的最简单方法是在 taskdef 任务上使用 loaderRef。例如(注意匹配的 loaderRef 标签):

      <taskdef name="ivy-retrieve" 
           classname="org.apache.ivy.ant.IvyRetrieve" 
           classpathref="ivy.lib" 
           loaderRef="ivy.loader"/>
      <taskdef name="ivy-publish" 
           classname="org.apache.ivy.ant.IvyPublish" 
           classpathref="ivy.lib" 
           loaderRef="ivy.loader"/>
      

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2017-07-24
        • 2016-11-13
        • 2017-10-11
        • 2021-10-13
        • 2011-02-24
        • 2013-11-16
        • 2011-10-16
        • 2012-11-03
        相关资源
        最近更新 更多