2008-12-09 123 views
24

我完全茫然如何蚂蚁任务常春藤:发布应该工作。常春藤:发布工作?

我希望,我做我的正常建设,创造了一堆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:

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

我有一大堆其中以各种方式互相依赖的子项目。考虑到常春藤:发布我不清楚如何开始。

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

  2. 在开发我想再次发布内置的文件,在不改变版本号至今的过程。

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

  4. 对于实际发布,我想使分布有依赖性,无,不知何故,我想我可以使用不同的配置为。我怎样才能利用这些优势?

+0

根据[this](http://ant.apache.org/ivy/history/latest-milestone/use/deliver.html)的简单供参考,`deliver`任务由`publish`任务调用。 – itudoben 2012-08-28 17:29:14

回答

9

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

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

它受模式控制。这page覆盖它很好。它看起来像你想你的是:

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

你还需要找出三个罐子作为ivy.xml文件假象。类似这样的:

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

认识常春藤在这里做什么很重要。它不是简单地将你的神器罐子复制到常青藤资源库中 - 它还会生成相关的“.ivy.xml”文件,它们指定每个工件的所有依赖项。

在封面下,ivy:retrieve任务实际上也触发了ivy:resolve。当发生ivy:resolve时,会将文件写入本地常青藤缓存(位于user.home.ivy文件夹中),该文件指定了解析的方式(需要哪些修订才能完成解析。)遇到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"/> 
4

首先你需要一个ivy.xml文件。在的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> 

的信息元素和出版物元素让你 跳过对build.xml中的常春藤元素的各种属性。

请注意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> 

... 
+0

很好的参考http://draconianoverlord.com/2010/07/18/publishing-to-maven-repos-with-ivy.html – 2012-01-13 18:09:18

2

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

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

您并没有真正指定工件,而是找到要发布的工件的模式。您可以通过<ivy:publish>任务中的<artifacts>子任务指定此项。例如,如果你建立了${basedir}/target/archive目录下的一切都像我们这样做,你可以将它指定为这样:

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

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

你不需要做<ivy:retrieve>。毕竟,你正在运行一个构建来创建新的罐子,并且他们应该在你的构建中成为SOMEWHERE。否则,如果你没有创建jar或war,你想要发布到你的常青藤资源库中?而且,您当然不想检索您的常青藤资源库中的某些内容,只是为了重新发布它。


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

我们使用Artifactory作为常青藤资源库(以及我们的Maven资源库)。我们使用Jenkins作为我们的连续构建服务器。

我所做的是让开发人员通过<ivy:makepom>任务将pom.xml文件从ivy.xml文件中取出。这个和生成的罐子/战争在Jenkins中被保存为已存档的工件。

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