Gradle 如何向每个“存储库”块或每个RepositoryHandler添加方法?
有许多开发人员和gradle项目的大型项目使用私有maven存储库来存储插件、依赖项和发布 我想定义一个Gradle 如何向每个“存储库”块或每个RepositoryHandler添加方法?,gradle,gradle-plugin,Gradle,Gradle Plugin,有许多开发人员和gradle项目的大型项目使用私有maven存储库来存储插件、依赖项和发布 我想定义一个privateMaven()方法,就像内置的jcenter()、mavenCentral()和google()方法一样。目前,我们在需要使用存储库的任何地方编写一个maven块-存储库,发布.repositories,插件管理.repositories repositories { maven { url "..." credentials { ...
privateMaven()
方法,就像内置的jcenter()
、mavenCentral()
和google()
方法一样。目前,我们在需要使用存储库的任何地方编写一个maven
块-存储库
,发布.repositories
,插件管理.repositories
repositories {
maven {
url "..."
credentials { ... }
}
}
我宁愿这样
repositories {
private()
}
这说明了如何扩展repositories
和buildscript.repositories
,但它不适用于发布。repositories
,因为发布
是由插件提供的,不适用于pluginManagement.repositories
。此外,我还必须枚举每个存储库配置,开发人员不能在我们不扩展的任何块中使用privateMaven()
init脚本是否有办法向每个
存储库
块或每个RepositoryHandler添加方法?假设您使用的是maven publish插件,您可以定义如下扩展:
格雷德尔二等兵
apply plugin: 'maven-publish'
publishing.repositories.ext.privateRepo = {
publishing.repositories.maven {
url "https://artifactory.website.com/private-repo"
credentials {...}
}
}
格雷德尔先生
apply from: 'private.gradle' // or you can just include the script in here
afterEvaluate {
publishing {
publications {...}
repositories {
privateRepo()
}
}
}
如果你想发布脚本,你也可以创建一个插件,使用方法将保持不变。
PrivatePlugin.groovy
class PrivatePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
// check if the publishing extension exists first
final publishing = project.extensions.findByType(PublishingExtension.class)
if (publishing != null) {
publishing.repositories.ext.privateRepo = {
publishing.repositories.maven {
url "https://artifactory.website.com/private-repo"
credentials {...}
}
}
}
}
}
class PrivatePlugin实现插件{
@凌驾
无效申请(项目){
//首先检查发布扩展是否存在
最终发布=project.extensions.findByType(PublishingExtension.class)
如果(发布!=null){
publishing.repositories.ext.privateRepo={
publishing.repositories.maven{
url“https://artifactory.website.com/private-repo"
凭证{…}
}
}
}
}
}
只要确保如果您将其作为插件分发,就不会附带硬编码的凭据。我的目标是任何存储库块都可以使用privateMaven
。我不想显式扩展publishing.repositories.ext
,repositories.ext
,buildscript.repositories.ext
。除了单调乏味之外,如果我错过了一个存储库
,或者gradle添加了一个新的存储库
,那么privateMaven
将不可用
一个接近但并不完美的解决方案是使用引用RepositoryHandler的方法在上创建扩展
任何存储库块,现在使用扩展
repositories {
custom.privateMaven(it)
}
我还没有解决的一个主要障碍是init.d脚本中定义的类不能加载到build.gradle中。如果在init.d脚本中定义了
PrivateMavenExtensions
,我就无法从build.gradle.kts中以类型安全的方式引用扩展,因为无法解析()
。我已经找到了如何向dsl添加扩展的方法,但我不想在出现存储库的任何地方都列举它。依赖项,插件,发布插件。。。
beforeSettings {
extensions.create("custom", PrivateMavenExtension::class)
}
allprojects {
extensions.create("custom", PrivateMavenExtension::class)
}
open class PrivateMavenExtension {
fun privateMaven(handler: RepositoryHandler): MavenArtifactRepository {
return handler.maven {
// implementation
}
}
}