ivy:publish 是如何工作的?
Posted
技术标签:
【中文标题】ivy:publish 是如何工作的?【英文标题】:How does ivy:publish work? 【发布时间】: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 我不清楚如何开始。
如何处理第一个版本?我对所有子项目都有一个共同的版本号,以表明它们属于一起(比如说 0.9)。因此,第一个修订版应该是 0.9.0,但到目前为止,我的存储库中没有任何项目。如何让 Ivy 分配此修订号。
在开发过程中我想再次发布构建的文件,目前不更改修订号。
如果我完成了我的工作,我想将它推送到一个共享存储库(并将修订号从 0.9.0 增加到 0.9.1),推荐的方法是什么?
1234563我怎样才能利用它来发挥我的优势?【问题讨论】:
仅供参考,根据thisdeliver
任务由publish
任务调用。
【参考方案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>
...
【讨论】:
很好的参考draconianoverlord.com/2010/07/18/…【参考方案3】:您应该先运行<ivy:deliver/>
任务。这将创建一个 ivy.xml 文件,可供 Ivy 存储库使用。
当您使用<ivy:publish>
时,您可以通过在resolver
参数中指定要发布到哪个存储库。这需要与您的 ivy.settings.xml
文件中的解析器名称相匹配。
您并没有真正指定工件,而是指定在哪里找到要发布的工件的模式。您可以通过<ivy:publish>
任务上的<artifacts>
子任务来指定它。例如,如果您像我们一样在$basedir/target/archive
目录下构建所有内容,您可以将其指定为:
<ivy:publish resolver="public">
<artifacts path="target/archive/[artifact].[ext]"/>
</ivy:publish>
如果要更改文件的修订号,可以使用<ivy:publish>
任务的pubrevision 参数。这不会更新 ivy.xml
,但会将您的 jars/wars 发布到正确的修订版。我更喜欢使用<ivy:deliver>
任务的pubrevision 参数,让它创建正确的ivy.xml
文件。然后,<ivy:publish>
将使用我的ivy.xml
文件中的修订。
你不需要做<ivy:retrieve>
。毕竟,您正在运行构建以创建新的 jar,它们应该在您的构建中的某个位置。否则,如果您不创建 jar 或 war,您想将什么发布到您的 Ivy 存储库中?而且,您当然不想为了重新发布而检索 Ivy 存储库中已有的内容。
我的理念一直是发布是一项 CM 任务,不应作为构建过程的一部分来完成。因此,我们不使用<ivy:deliver>
或<ivy:publish>
。
我们使用 Artifactory 作为我们的 Ivy 存储库(和我们的 Maven 存储库)。我们使用Jenkins 作为我们的持续构建服务器。
我要做的是让开发人员通过<ivy:makepom>
任务从他们的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:resolve
和ivy: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"/>
【讨论】:
以上是关于ivy:publish 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
每月第 5 个工作日的 TimeTrigger - 计划的 Web 作业 Azure