使用 .ivy2 缓存的副本作为 SBT 解析器源

Using a copy of the .ivy2 cache as SBT resolver source

我正在尝试打包一些内部工件以用于 SBT。在大多数情况下,我只会使用 libs 目录,但是有多个项目共享相同的工件。

我一直在尝试使用 SBT 生成的目录结构作为这个小型存储库的基础。它将工件存储在 .ivy2 中,如下所示:

.ivy2/cache/[org-with-dots]/[module]/[artifact]-[version].[ext]

我已经将 cache 下我需要的东西复制到它自己的文件夹中,然后在 SBT 中尝试了以下模式无济于事:

resolvers += "cache" at "file:/../ivy-cache"
resolvers += Resolver.file("cache", file("../ivy-cache"))
resolvers += Resolver.file("cache", file("../ivy-cache"))(Resolver.ivyStylePatterns)
resolvers += Resolver.file("cache", file("../ivy-cache"))(Patterns("[organization]/[module]/[artifact]-[revision].[ext]"))

None 这些作品。最接近的是最后一个,但是组织起来是斜线而不是点。 Resolver.ivyStylePatterns 在组织中使用了点,但希望使用名为 ivys 的文件夹。

所以我有一个分为两部分的问题:

  1. 我是否应该做其他事情来捕获这些本地托管的工件?我不是在建造它们,所以 publish 是不可取的。
  2. 有没有一种方法可以指定上面我想要的模式,而无需在组织组件中进行从 /. 的字符串替换?

首先,ivy 缓存具有不同的文件系统布局,这可能解释了您在 sbt

中遇到的模式匹配问题

其次(更重要的是)常春藤缓存并非设计用作构建所依赖的文件的最终副本。例如,缓存可能会被清除(事实上,ivy 包含一个 command 正是这样做的)。

与以下问题相关:

  • Apache Ivy: Difference between local Ivy cache and local repository
  • Unable to add jar file to .ivy cache manually

找到答案,Pattern 有一个 apply 重载,它的第一个参数采用布尔参数。当 true 它使用 Maven 风格的组织字符串,它使用斜杠来分隔组件,当 false 它使用 Ivy 风格(点)。

以下是有效的方法(使用 SBT 0.3.9):

resolvers += Resolver.file("cache", file("../ivy-cache"))(Patterns(false,"[organization]/[module]/[artifact]-[revision].[ext]"))

PS:如果有人提供更好的工作流程,我会接受这个答案...