常春藤从常春藤缓存中删除不需要的(旧)工件

Posted

技术标签:

【中文标题】常春藤从常春藤缓存中删除不需要的(旧)工件【英文标题】:Ivy deletion of unwanted (older) artifacts from Ivy cache 【发布时间】:2011-04-12 06:35:15 【问题描述】:

我有一个本地 Artifactory 存储库,其中有两个用于 commons-logging 的 jar:一个用于 version 1.0.4,一个用于 version 1.1.1。我正在尝试使用 Ivy 下载带有 ant 任务的旧版本(在 ivy.xml 中具有正确的依赖标记),然后我将此依赖标记的“rev”属性更改为 1.1.1。

在 ant 中使用 ivy:resolve 时,这个较新的 jar 会成功下载到我的缓存中,但旧的 jar 不会自动删除,我想实现这一点。

查看 Ivy 文档后,我不知道该怎么做;有谁知道如何让 Ivy 在下载较新的工件时删除旧版本的工件,无论是通过解决任务还是其他方式?

【问题讨论】:

【参考方案1】:

在缓存中有“旧”jar 确实没有问题。如果您的项目不需要较旧的 jar,Ivy 将直接忽略它。旧 jar 在您的系统中占用大约 50 KB。在太字节驱动器时代,释放空间不值得花时间和精力。

Ivy 缓存就是这样:一个缓存。它适用于您使用 Ivy 的所有项目。如果一个较旧的项目需要 1.0.4 版本的 commons-logging jar,它已经在 Ivy 缓存中并且不必下载,因此,就像一个好的缓存一样,它可以节省您的时间和精力。

您可以执行<ivy:cleancache>,但这确实会清除您的整个缓存:所有内容都将被删除。它将摆脱 jar 的旧 1.0.4 版本,但它也将摆脱 jar 的 1.1.1 版本。当然,Ivy 会在下一次请求时下载它,但这意味着等待 Ivy 下载你所有的 jar。

顺便说一句,这是<ivy:cleancache> 的一个大问题:如果您使用 Ivy 进行多个构建并且其中一个清理了您身上的缓存,那么您最终会破坏其他构建。通常,这不是个人用户的问题,但可能是持续集成系统的问题。

如果您查看 Ivy 文档,它确实说 <ivy:cleancache> 与以下内容相同:

<delete dir="$ivy.cache.dir" />

您可以以此为基础,使用日期selector 删除旧 jar:

<delete dir="$ivy.cache.dir">
    <date datetime="01/01/2010 12:00 AM" when="before"/>
    <include name="*.jar"/>
</delete>

但是,它使用 jar 的修改日期,而不是创建 jar 的日期。

忽略您的 Ivy 缓存目录,不要担心。如果 Ivy 缓存过大,您可以将其删除,Ivy 将根据需要重新下载新的 jar。

【讨论】:

【参考方案2】:

我总是包含一个 ANT “realclean” 目标,它会另外清除我的 ivy 缓存。

<target name="clean">
    <delete dir="$build.dir"/>
</target>

<target name="realclean" depends="clean">
    <ivy:cleancache/>
</target>

Doco

【讨论】:

ivy:cleancache 的一个问题是它每次调用时都会删除缓存文件夹。因此,每次缓存都必须重新构建。这与需要缓存的操作相反。创建缓存违背了它必须提供的性能优势的目的。

以上是关于常春藤从常春藤缓存中删除不需要的(旧)工件的主要内容,如果未能解决你的问题,请参考以下文章

解决常春藤的最佳链

使用常春藤更改常春藤中的默认存储库

常春藤的单独缓存文件夹

常春藤不使用分类器拉动对 jar 的传递依赖

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

常春藤解决不使用动态工件