【发布时间】:2016-06-15 04:52:10
【问题描述】:
我使用 Gradle 作为我的项目的构建工具。除了我的本地开发计算机之外,还有一个 Nexus 存储库管理器缓存来自 Maven Central(和其他)的包以及本地发布和 SNAPSHOT 构建,它们至少每天由 Jenkins CI 发布。
在build.gradle我有以下repos定义:
repositories {
mavenLocal()
maven { url http://url.to.nexus:8081/nexus/... }
flatDir {
...
}
}
项目 (A) 引用了几个内部库(例如 B) - 也在 SNAPSHOT 版本中。如果我构建A,则从 Nexus 获取引用的B SNAPSHOT 版本,因为mavenLocal 中没有版本,并且 Jenkins 发布了所需的版本 - 所以一切都很好。
如果我更改 B 中的某些内容并想立即在 A 中使用,我会在本地构建/安装 B(使用 gradle install)并且当前的 SNAPSHOT 进入 mavenLocal 使其可用于A 的构建。
但从此时起,库B总是从mavenLocal 获取。即使一段时间后一位同事更改了B,并且 Nexus 上有更新的 SNAPSHOT 版本,它也不会被使用。
使用 Maven 可以指定一个 updatePolicy 像 daily(这也是默认值)来解决问题。但我看不到如何在 Gradle 中执行此操作(除了每天清除一次 ~/.m2/repository)。
== 更新 ==
根据jlb的评论,我想补充一下:
我没有在 Maven 设置中定义任何存储库,因为依赖项解析和工件下载完全由 gradle 管理。所以所有的存储库都只在 Gradle 的构建脚本中定义。
使用本地 Maven 存储库只是一种(通常推荐的)解决方法,以便在其他项目中使用本地(中间)库构建,而无需每次都将它们发布到某个存储库管理器。 IMO 在扩展库时这是必不可少的(上面示例中的B)。
此外,这仅在存储库的顺序如上所述定义时才有效。如果存储库中存在相同快照版本的工件,则不会检查进一步的存储库,即使那里可能有更新的(快照)构建可用。
【问题讨论】:
标签: maven jenkins gradle nexus