【问题标题】:How to specify "updatepolicy" for Gradle-build using mavenLocal()如何使用 mavenLocal() 为 Gradle-build 指定“updatepolicy”
【发布时间】: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 可以指定一个 updatePolicydaily(这也是默认值)来解决问题。但我看不到如何在 Gradle 中执行此操作(除了每天清除一次 ~/.m2/repository)。

== 更新 ==

根据jlb的评论,我想补充一下:

我没有在 Maven 设置中定义任何存储库,因为依赖项解析和工件下载完全由 gradle 管理。所以所有的存储库都只在 Gradle 的构建脚本中定义。 使用本地 Maven 存储库只是一种(通常推荐的)解决方法,以便在其他项目中使用本地(中间)库构建,而无需每次都将它们发布到某个存储库管理器。 IMO 在扩展库时这是必不可少的(上面示例中的B)。

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

【问题讨论】:

    标签: maven jenkins gradle nexus


    【解决方案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 检查更新版本的最佳方法 依赖项是将依赖项标记为“正在更改”。然后 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
    }
    

    【讨论】:

      【解决方案2】:

      from gradle doc point 23.6.3 解释说 graddle 会寻找你的 maven settings.xml 尝试在 $user_home/.m2/settings.xml 中定义更新策略 在此处定义您的远程存储库并将更新策略设置为“始终”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
      

      原来如此

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 2015-05-08
        • 2020-05-28
        • 2019-05-13
        • 2015-07-13
        • 2015-05-15
        • 2018-11-28
        • 1970-01-01
        相关资源
        最近更新 更多