SBT 如何为特定的 groupid 禁用 Ivy 缓存

Posted

技术标签:

【中文标题】SBT 如何为特定的 groupid 禁用 Ivy 缓存【英文标题】:SBT How to disable Ivy cache for a specific groupid 【发布时间】:2014-08-21 22:43:47 【问题描述】:

我有几个使用 SBT 构建的 Scala 模块。其中一些(我称它们为依赖模块)正在发布到 Artifactory,然后被***模块使用。

对代码的所有更改都在单独的 git 分支中完成。当功能(或错误修复)完成后,该分支在 Jenkins 中编译,然后部署到测试实例并移交给 QA 团队。

所以在依赖模块中可能会有几个不同代码的git分支。

问题在于 Ivy 正在本地缓存这些模块,因此可能会使用来自不同分支的依赖模块(取自本地缓存)构建***模块。

我已经尝试将changing() 指令添加到build.sbt 的依赖规范中。

在这种情况下,Ivy 会忽略本地缓存,每次都去 Artifactory 下载 POM 文件。然后它解析 POM 文件,但断定它在本地缓存中有具有该版本的 jar 文件,并从本地缓存而不是从 Artifactory 获取 jar 文件。这不是我想要的。

由于此时分支中的代码还没有集成到主分支中,因此不同的特性分支具有相同的版本号,但代码不同是完全有效的。

有没有办法告诉 Ivy(通过 SBT)忽略某个 groupid 的本地缓存?或者至少是一个依赖?

【问题讨论】:

您是否尝试将版本标记为 SNAPSHOT? 【参考方案1】:

如果您对依赖模块使用版本控制,那么每个代码库更改都必须产生不同的版本。 Ivy 和 maven 预计,一旦工件以特定版本发布,它将永远保持不变。这就是他们使用缓存文件的原因。如果您想在每次编译时从存储库下载新版本,您应该将 -SNAPSHOT 后缀添加到依赖模块版本号(例如:dep-module-1.1.1-SNAPSHOT)

【讨论】:

嗯,添加 SNAPSHOT 与添加 changes() 到依赖项相同,如 def appDependencies = Seq("com.foo"%"foo-api"%"1.0" changing(), ...。这迫使 Ivy 在每次编译时从存储库中获取 POM 文件,但随后它不会获取 jar,如原始帖子中所述。 您是否尝试过按照 SBT 官方文档中列出的故障排除步骤进行操作? scala-sbt.org/release/docs/… 你的意思是明确地运行更新?不,因为我不确定在这种情况下并行构建会发生什么。我已经通过使用 sbt-dirty-money 插件解决了我的直接问题,该插件在编译开始之前从常春藤缓存中删除我的 com.foo 工件。这工作得很好,因为 ivy 每次都必须下载工件,因为它们不会在缓存中。但是,我不确定如果我在 Jenkins 中使用并行构建会发生什么。我目前只使用一个执行器,所以这不会发生。如果我尝试明确使用更新,我想我会遇到同样的问题。 据我所知,您的大部分问题来自未正确控制相关工件的版本。如果您的并发构建要求相同的工件版本但期望的内容不同,那就是一个问题。您可以采用一些自动增量版本编号方案。这意味着您必须将 build.sbt 内容与最新的工件版本同步,但它使并发构建安全。 它们没有独特的版本,因为它们存在于不同的(开发)git 分支中。每个分支都是自己的世界,内部具有独特的版本控制。但不考虑其他分支。这就是开发分支应该是的。同步版本号是可能的,但代价是可能出现人为错误,我非常希望避免这种情况。

以上是关于SBT 如何为特定的 groupid 禁用 Ivy 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个用户或系统范围配置 Ivy 缓存目录?

如何为 sbt/play 禁用彩色终端输出?

如何为特定活动禁用 Android 软键盘?

如何让 sbt 使用本地 Maven 代理存储库(Nexus)?

如何为特定活动禁用Android Soft Keyboard?

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