[Gradle]如何配置指定制品库下载指定规则的制品

最近在做架构相关的设计

  有些公司在开发微服务架构时会有自己的制品库,例如Nexus或者各种项目管理工具自带的制品库之类的(Coding、Space等)。

  这个时候就会涉及到,使用相关构件的项目需要下载指定的团队内部制品的问题,一般的制品库都有"代理"的功能,就是在你私有的制品库内不存在某个包时,会到公共的制品库去下载,就比如:

repositories {
  maven {
    url youArtifactsRepoUrl
    credentials {
      username = youArtifactsGradleUsername
      password = youArtifactsGradlePassword
    }
  }
}
dependencies {
	implementation 'org.projectlombok:lombok:1.18.14'
	annotationProcessor 'org.projectlombok:lombok:1.18.14'
}

  这个时候如果这个制品库没有设置代理,且库内没有lombok:1.18.14的话gradle就会提示你下载失败。如果你设置了代理的话代理就会先去中央仓库拉取lombok,然后再返回给你的gradle,就可以下载成功。

问题解决了?

没有!

这个时候你会发现,你的私有制品库里多了个lombok的制品!

image

对于强迫症的我,根本无法接受。

 即便你在repository配置里加上了mavenCentral()无济于事,因为gradle依旧会按照顺序去私有制品库拉取包,然后再下载,只有关闭了私有制品库的代理才能解决问题。

 但是关闭代理后问题又来了,如果你关闭了代理,并且加上了mavenCentral(),新的公共制品依旧会下载不成功。

 因为在你的私有制品库里不存在该制品(没有代理),但是你的制品库却又能连接成功

repositories {
    maven {
        url youArtifactsRepoUrl
        credentials {
            username = youArtifactsGradleUsername
            password = youArtifactsGradlePassword
        }
    }
    mavenCentral()
}

 只要你的私有制品库能连接成功,那么gradle永远不会去mavenCentral内下载其他的私有库不存在的制品

解决方案

我们可以配置在私有库下载指定的构件!

只需要:

repositories {
    maven {
        url youArtifactsRepoUrl
        credentials {
            username = youArtifactsGradleUsername
            password = youArtifactsGradlePassword
        }
        content{
            includeGroupByRegex "cn\\.kkjb.*"
        }
    }
    mavenCentral()
}

即可

这时候gradle只会在私有库内下载指定的包,当包名不符合表达式时就会去下一个库的定义中去下载

当然,content还有image

image

等函数来配置下载构件的匹配方式,大家具体可以去gradle官方文档查阅:

有些同学可能会觉得无所谓,就算私有库里代理下载下来了这么多公共构件也无所谓啊,但是你要考虑三点:

  • 私有库的硬盘容量
  • 私有库服务的带宽
  • 私有库的构件纯洁性

只要你考虑了这三点,你也会跟我一样,不会使用私有库的公共代理

PS:该功能需要gradle5.1以上才可以使用,但是我个人感觉现在世界上用gradle6以下的开发者都是少之又少(IDEA已默认7.1),你不会真的钻牛角尖去用5以下吧?不会吧?

image

配了制品库更新机器人,下了Springboot的一点依赖,撤回到手酸555555
原文博客:[Gradle]如何配置指定制品库下载指定规则的制品 | 心·技·体

1 个赞