如何根据本地 ivy 文件检查 Artifactory 中是不是存在工件

Posted

技术标签:

【中文标题】如何根据本地 ivy 文件检查 Artifactory 中是不是存在工件【英文标题】:How to check if an artifact exist in Artifactory based on a local ivy file如何根据本地 ivy 文件检查 Artifactory 中是否存在工件 【发布时间】:2015-12-10 01:25:18 【问题描述】:

我认为 ivy:info 任务会...

<ivy:info file="$local_ivy_file"/>
<ivy:info organisation="$ivy.organisation" module="$ivy.module" revision="$ivy.revision" property="check"/>

但即使项目在 repo 中不存在,“check”的属性(check.organisation、check.module、check.revision)总是返回与 ivy.organisation 等相同的值...当“检查”属性的预期值应该为 null 时(因为它们在 repo 中不存在)

我错过了什么吗?

为什么需要这样做:

我有大量第三方 jar 文件要上传,但如果文件存在,我没有管理员权限来覆盖(也不应该覆盖)。

在做

<ivy:publish overwrite="false"/>

将破坏整个过程,而我需要任务继续循环遍历整个 jars/ivy.xml。

谢谢

【问题讨论】:

如果您正在寻找发布序列中的下一个免费版本号,那么您需要使用 ivy buildnumber 任务,请参阅:ant.apache.org/ivy/history/latest-milestone/use/… 我不是在寻找下一个免费版本号,我只是想跳过已经存在的版本的发布,并继续发布其余版本。 Ivy 并不是为此而设计的,虽然它是一个很棒的依赖管理客户端,但它作为存储库管理器却很糟糕。我建议您编写您的要求,常春藤可以轻松适应您选择将文件存储到的任何文件目录结构。或者(从长远来看可能更好)使用标准 Maven 存储库管理器之一:Nexus、Artifactory 或 Achiva 【参考方案1】:

我发现了我的问题。我原来的方法确实有效,除了我必须在运行 info 任务之前删除 ivy 缓存,因为 ivy 在查看 repo 之前先查看缓存。

<delete dir="$ivy_cache_path"/>
<ivy:info file="$local_ivy_file"/>
<ivy:info organisation="$ivy.organisation" module="$ivy.module" revision="$ivy.revision" property="check"/>

现在 $check.revision 如果工件存在于在线 repo 中,则正确捕获源 ivy 文件中工件的修订版本,如果不存在则没有任何价值。我可以将此作为后续任务的条件。

【讨论】:

以上是关于如何根据本地 ivy 文件检查 Artifactory 中是不是存在工件的主要内容,如果未能解决你的问题,请参考以下文章

如何为项目/lib 中的本地 jar 创建 Ivy 依赖项?

手动检索 Ivy 依赖项作为 sbt 中的本地非托管库

如何添加jcenter仓库 gradle依赖

我不知道如何使用 Apache Ivy

如何设置 IntelliJ Idea Scala 项目以识别本地 Ivy2 缓存?

ivy:publish 是如何工作的?