我正在使用Gradle作为我的项目的构建工具。除了我的本地开发计算机之外,还有一个来自Maven Central(和其他人)的Nexus存储库管理器缓存包以及本地发布和SNAPSHOT版本,这些版本至少每天由Jenkins CI发布。
在build.gradle
中,我对回购有以下定义:
repositories {
mavenLocal()
maven { url http://url.to.nexus:8081/nexus/... }
flatDir {
...
}
}
项目(A
)引用了几个内部库(例如B
) - 也在SNAPSHOT版本中。如果我构建A
,则B
的引用的SNAPSHOT版本将从Nexus中获取,因为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-repository只是一种(通常建议的)解决方法,以便在其他项目中使用lib的本地(中间)构建,而无需每次都将它们发布到某个存储库管理器。 IMO在扩展库时很重要(上例中的B
)。
此外,这仅在存储库的顺序如上所述定义时才有效。如果存储库中存在相同快照版本的工件,则不会检查进一步的存储库,即使可能存在更新的(快照)构建。
答案 0 :(得分:1)
由于SNAPSHOT是Maven概念,因此它们不被视为任何东西 特别是常春藤'库。不幸的是,还没有(还) 为“maven”指定自定义模式的方法。存储库,所以你是一个 有点卡住了。
告诉Gradle检查a的更新版本的最佳方法 依赖性是将依赖关系标记为'更改'。 Gradle将会 每24小时检查一次更新,但可以使用 resolutionStrategy DSL。
configurations.all { // check for updates every build resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } dependencies { compile group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true }
答案 1 :(得分:0)
from gradle doc第23.6.3节解释了graddle会查找你的maven settings.xml
尝试在$ user_home / .m2 / settings.xml中定义更新策略在那里定义远程repositroy并将更新策略设置为“always”https://maven.apache.org/settings.html#Repositories
第23.7节解释了依赖性解析的规则:
给定必需的依赖项,Gradle首先尝试解析该依赖项的模块。按顺序检查每个存储库,首先搜索指示该模块是否存在的模块描述符文件(POM或Ivy文件)
等等 这里有一个愚蠢的问题:您是否尝试在自定义存储库之后定义mavenLocal(),以便构建在查找本地存储库之前首先搜索新的依赖项?
repositories {
maven { url http://url.to.nexus:8081/nexus/... }
...
}
mavenLocal()
}
击> <击> 撞击>
好的,所以今天我遇到了这个问题,我找到了this。我试过,它将新的插件版本下载到我的本地仓库中。没有时间仔细阅读链接,但是可以使用(gradle 2.5.3)
mavenRepo ("http://my.server/repos/my-grails-plugins") {
updatePolicy 'always'
}
并使用
grails compile --stacktrace --verbose --refresh-dependencies
所以,就是那个