用于定义自定义存储库的 Gradle 函数 (Kotlin)

dag*_*dag 9 gradle kotlin

正如Gradle 函数中已经问的那样,定义自定义 Maven 存储库?我想为存储库块定义命名函数。他们应该配置公共(但企业内部)存储库。

我们有一个自定义的 gradle 发行版,其中这些函数应该通过init.d script定义。

尽管上述问题中的代码适用于 groovy 脚本,但不适用于*.gradle.kts.

我希望能够使用Kotlin 扩展,它们在初始化脚本中运行得很好:

// init.d/repositories.gradle.kts

fun RepositoryHandler.buildRepo() {
    maven {
        url =  java.net.URI(System.getenv("MAVEN_BUILD_REPO_URL"))
        credentials {
            username = System.getenv("MAVEN_BUILD_REPO_URL")
            password = System.getenv("MAVEN_BUILD_REPO_URL")
        }
    }
}

allprojects {
    repositories {
        buildRepo()
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,一旦有人尝试在实际项目构建文件中使用它们,这些扩展就会消失:

repositories {
    buildRepo()
}
Run Code Online (Sandbox Code Playgroud)

对于 build.gradle 文件,错误是:

Could not find method buildRepo() for arguments [] on repository container of type org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler.
Run Code Online (Sandbox Code Playgroud)

对于 build.gradle.kts 来说,这是编译失败:

Script compilation error:

  Line 3:     buildRepo()
              ^ Unresolved reference: buildRepo
Run Code Online (Sandbox Code Playgroud)

我希望有人知道如何解决这个问题。

Mak*_*eev 0

我找不到一个优雅的解决方案,但下面的代码可以工作:

// init.d/init.gradle.kts

class MyRepoProvider(private val handler: RepositoryHandler) {
    operator fun invoke() {
        handler.apply {
            mavenCentral() // replace with your own repository
        }
    }
}

allprojects {
    repositories {
        extra.set("myRepo", MyRepoProvider(this))
    }
}
Run Code Online (Sandbox Code Playgroud)

build.gradle.kts它看起来像这样(不要害怕):

repositories {
    myRepo.invoke() // :scream:
}
Run Code Online (Sandbox Code Playgroud)

因为没有关于该myRepo对象具有运算符功能的信息。