常春藤怎么样:发表作品?
我完全不知道ant任务常春藤:发布应该如何工作。
我希望我做正常的构建,创建一堆jar文件,然后我会将这些jar推送到(本地)存储库。
如何指定从哪里检索构建的jar,以及它们将如何最终存储在存储库中?
更新:
Publish Local">
这实际上有效,我之前没有包含检索。
但我仍然有一些问题,假设我想发布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:
我让它工作(有点),但它仍然感觉不对。 不知何故,所有教程都关注第三方项目的依赖关系,但对我来说同样重要的一点是处理项目特定的依赖关系。
我有一堆子项目,它们以各种方式相互依赖。 考虑常春藤:发布我不清楚如何开始。
-
我该如何处理第一个版本? 我有一个共同的版本号用于所有子项目,以表明它们属于一起(假设为0.9)。 因此第一次修订应该是0.9.0,但到目前为止,我的项目中没有任何内容存在于我的存储库中。 如何让Ivy分配此修订号。
-
在开发过程中,我想再次发布构建的文件,而不更改到目前为止的版本号。
-
如果我完成了我的工作,我想将其推送到共享存储库(并将修订版号从0.9.0增加到0.9.1),建议的方法是什么?
-
对于实际的版本,我想制作具有依赖关系的发行版,但不知道,我想我可以使用不同的配置。 我怎样才能利用这个优势呢?
您需要指定“解析器”。 就像是:
它受模式控制。 这个页面很好地涵盖了它。 看起来你想要你的:
您需要在ivy.xml文件中将三个jar标识为工件。 像这样的东西:
首先,您需要一个ivy.xml文件。
... other config elements here... ...
ivy.xml中的info元素和publication元素允许您跳过build.xml中常春藤元素的各种属性。
请注意ivy.xml中的$ {project.revision}。 该属性在build.xml中给出了值,但这看起来效果很好。 然后,修订可以轻松地具有所需的任何值(例如,夜间构建与本地构建)。
以下是如何设置build.xml文件的示例
... ...
你想先运行
任务。 这将创建一个可供Ivy存储库使用的ivy.xml文件。
使用
,通过在resolver
参数中指定要指定要发布到的存储库。 这需要匹配ivy.settings.xml
文件中的解析程序名称。
您没有真正指定工件,而是指定要发布工件的模式。 您可以通过
任务上的
子任务指定此项。 例如,如果您像我们一样在${basedir}/target/archive
目录下构建所有内容,则可以将其指定为:
如果要更改文件的修订号,可以使用
任务的pubrevision参数。 这不会更新ivy.xml
,但会将您的jar / wars发布到正确的版本。 我更喜欢使用
任务的pubrevision参数,并让它创建正确的ivy.xml
文件。 然后,
将使用我的ivy.xml
文件中的修订版。
您不需要执行
。 毕竟,你正在运行一个构建来创建新的jar,它们应该在你的构建中是SOMEWHERE。 否则,如果你没有创建一个jar或战争你想要发布到你的常春藤存储库中的是什么? 并且,您当然不希望检索已经存在于Ivy存储库中的内容,只是为了重新发布它。
我的理念一直是发布是一项CM任务,不应该作为构建过程的一部分来完成。 因此,我们不使用
或
。
我们使用Artifactory作为我们的Ivy存储库(以及我们的Maven存储库)。 我们使用Jenkins作为我们的持续构建服务器。
我所做的是让开发人员通过
任务从他们的ivy.xml
文件中创建一个pom.xml
文件。 这个和构建jar / wars在Jenkins中保存为归档工件。
当我们对特定构建感到满意并希望它在我们的公共存储库中时,我使用Jenkin的Promote Build任务将其pom.xml的特定jar / war推广到我们的Artifactory存储库。 我们使用mvn deploy:deploy-file
任务来完成此任务。
重要的是要意识到常春藤正在做什么。 它不仅仅是将工件jar复制到常春藤存储库中 – 它还生成相关的“.ivy.xml”文件,这些文件指定了每个工件的所有依赖项。
在幕后, ivy:retrieve
任务实际上也触发了ivy:resolve
。 当ivy:resolve发生时, .ivy
一个文件写入您的本地常春藤缓存(在user.home
的.ivy
文件夹中),该文件指定解决方案的发生方式(完成解析所需的模块的哪些版本。)当ivy:publish
遇到ivy:publish
,从缓存中检索解析记录并用于为工件生成ivy.xml。
我在这方面遇到的最大陷阱是要求ivy:resolve
和ivy:publish
任务都是由ant执行时由同一个类加载器加载。 确保发生这种情况的最简单方法是在taskdef任务中使用loaderRef。 例如(注意匹配的loaderRef标签):