最近在做架构相关的设计
有些公司在开发微服务架构时会有自己的制品库,例如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的制品!
对于强迫症的我,根本无法接受。
即便你在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还有
等函数来配置下载构件的匹配方式,大家具体可以去gradle官方文档查阅:
有些同学可能会觉得无所谓,就算私有库里代理下载下来了这么多公共构件也无所谓啊,但是你要考虑三点:
- 私有库的硬盘容量
- 私有库服务的带宽
- 私有库的构件纯洁性
只要你考虑了这三点,你也会跟我一样,不会使用私有库的公共代理
PS:该功能需要gradle5.1以上才可以使用,但是我个人感觉现在世界上用gradle6以下的开发者都是少之又少(IDEA已默认7.1),你不会真的钻牛角尖去用5以下吧?不会吧?
配了制品库更新机器人,下了Springboot的一点依赖,撤回到手酸555555
原文博客:[Gradle]如何配置指定制品库下载指定规则的制品 | 心·技·体