26

我完全不知道蚂蚁任务 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. 对于实际版本,我想制作具有依赖关系的发行版,而没有,不知何故我想我可以为此使用不同的配置。我怎样才能利用它来发挥我的优势?

4

4 回答 4

10

您需要指定“解析器”。就像是:

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

它由模式控制。这个页面很好地涵盖了它。看起来你希望你的成为:

<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>
于 2008-12-09T16:30:17.303 回答
4

首先,您需要一个 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>

...
于 2012-01-13T16:28:00.813 回答
3

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

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

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

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

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

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


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

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

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

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

于 2012-08-28T18:07:11.983 回答
0

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

在幕后,该ivy:retrieve任务实际上也在触发一个ivy:resolve. 当 ivy:resolve 发生时,一个文件被写入本地 ivy 缓存(在 中的.ivy文件夹中user.home),该文件指定解析是如何发生的(需要哪些模块的哪些修订来完成解析。)ivy:publish遇到时,该解析记录是从缓存中检索并用于为您的工件生成 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"/>
于 2008-12-10T06:10:26.540 回答