Gradle 如何向每个“存储库”块或每个RepositoryHandler添加方法?

Gradle 如何向每个“存储库”块或每个RepositoryHandler添加方法?,gradle,gradle-plugin,Gradle,Gradle Plugin,有许多开发人员和gradle项目的大型项目使用私有maven存储库来存储插件、依赖项和发布 我想定义一个privateMaven()方法,就像内置的jcenter()、mavenCentral()和google()方法一样。目前,我们在需要使用存储库的任何地方编写一个maven块-存储库,发布.repositories,插件管理.repositories repositories { maven { url "..." credentials { ...

有许多开发人员和gradle项目的大型项目使用私有maven存储库来存储插件、依赖项和发布

我想定义一个
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
    }
  }
}