【问题标题】:SBT How to disable Ivy cache for a specific groupidSBT 如何为特定的 groupid 禁用 Ivy 缓存
【发布时间】: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?

标签: sbt


【解决方案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 分支中。每个分支都是自己的世界,内部具有独特的版本控制。但不考虑其他分支。这就是开发分支应该是的。同步版本号是可能的,但代价是可能出现人为错误,我非常希望避免这种情况。
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 2014-10-04
  • 2022-01-15
  • 1970-01-01
  • 2016-03-21
  • 2015-05-17
  • 2016-01-30
  • 2023-04-10
相关资源
最近更新 更多