如何指定" updatepolicy" for gradle-build使用mavenLocal()

时间:2016-03-02 11:08:09

标签: maven jenkins gradle nexus

我正在使用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)。

此外,这仅在存储库的顺序如上所述定义时才有效。如果存储库中存在相同快照版本的工件,则不会检查进一步的存储库,即使可能存在更新的(快照)构建。

2 个答案:

答案 0 :(得分:1)

我在这里找到答案:https://discuss.gradle.org/t/how-to-get-gradle-to-download-newer-snapshots-to-gradle-cache-when-using-an-ivy-repository/7344

  

由于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

所以,就是那个