我在哪里可以定义一个存储库函数,以便我可以在整个 gradle 构建(包括 buildSrc)中使用它?

问题描述 投票:0回答:1

我有一个函数可以替代

mavenCentral
,它创建一个 ArtifactRepository:

fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
    // about 20 lines of code
}

我有一个多项目 Gradle 构建,它也有一个

buildSrc
,我想要 使用
myCustomRepository

  • 适用于依赖项加载和插件加载
  • 在我的根项目、所有子项目以及
    buildSrc

我发现最好的方法是使用

settings.gradle.kts
buildSrc/settings.gradle.kts
并在四个地方使用该函数:

  • 插件管理中的settings.gradle.kts
  • dependencyResolutionManagement 中的settings.gradle.kts
  • 插件管理中的buildSrc/settings.gradle.kts
  • dependencyResolutionManagement 中的 buildSrc/settings.gradle.kts

不幸的是, 看来我还需要define该函数的四个相同的副本, 每个

settings.gradle.kts
文件中有两个。我连一个地方都找不到 定义它对我需要使用它的所有四个位置都可见。

即:

settings.gradle.kts

fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
    // copy #1
}

pluginManagement {
    fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
        // copy #2
    }

    repositories {
        myCustomRepository()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositories {
        myCustomRepository()
    }
}

buildSrc/settings.gradle.kts

fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
    // copy #3
}

pluginManagement {
    fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
        // copy #4
    }

    repositories {
        myCustomRepository()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositories {
        myCustomRepository()
        gradlePluginPortal()
    }
}

有没有办法只在ONE地方定义这个函数,并在 这四个地方都是吗?

gradle gradle-kotlin-dsl
1个回答
0
投票

pluginManagement
很特别

您不能简单地在

pluginManagement
块中使用外部函数,因为
pluginManagement
plugins
块一样,与文件的其余部分1 隔离,因此没有导入机制。

复合构建中的设置插件

您可以做的替代方案是在

包含的构建
中编写一个Settings插件。这样的设置插件本身可以在
pluginManagement
内执行操作,包括调用给定的函数。

此外,设置插件在应用于

plugins
块内时,会将其 JAR 添加到
settings.gradle.kts
文件的类路径中,以便您可以使用该文件中插件项目中定义的任何其他函数(尽管不是
pluginManagement
) .

布局草图

总而言之,看起来像这样:

  1. 包含一个构建项目,它使用 Java Gradle 插件定义和导出设置插件,并声明您的函数

    myCustomRepository()
    。这是关键源文件:

    // myIncludedBuild/src/main/kotlin/MySettingsPlugin.kt
    
    class MySettingsPlugin : Plugin<Settings> {
        override fun apply(target: Settings) {
            target.pluginManagement.apply {
                repositories.myCustomRepository()
            }
        }
    }
    
    fun RepositoryHandler.myCustomRepository() {
        println(this::class.qualifiedName)
    }
    
  2. 然后在主项目的

    settings.gradle.kts
    中你可以做:

    pluginManagement {
        includeBuild("myIncludedBuild")
    }
    
    plugins {
        // Calls myCustomRepository via its apply method
        id("mySettingsPlugin")
    }
    
    dependencyResolutionManagement {
        repositories.myCustomRepository()
    }
    
  3. buildSrc
    settings.gradle.kts
    是相同的,只是它需要稍微不同的相对路径来查找包含的构建:

    pluginManagement {
        includeBuild("../myIncludedBuild")
    }
    

执行该构建,您将获得以下输出四次:

org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler_Decorated

在其他
build.gradle.kts
文件中使用

现在您已经有了一个包含的构建,您可以使用

Project
插件以类似的方式继续,或者直接使用
buildscript
块将包含的构建项目的代码添加到任何给定的
build.gradle.kts
文件中。


1Gradle 6.0升级说明

© www.soinside.com 2019 - 2024. All rights reserved.