Gradle 7.2: 如何应用自定义Gradle SETTINGS插件?

6
我正在将buildSrc约定插件迁移到独立插件。创建Gradle项目对象的插件示例很多,但对于Settings和Gradle却缺乏。我想将我们在gradle.settings.kts文件中使用的仓库列表集中到一起,因此我创建了一个Gradle Settings插件:RepositoriesPlugin。
它的实现方式与Project插件相同,但是,我不确定如何解释Gradle文档中的以下引用:“插件可以接收Settings类型的参数,这样插件就可以在设置脚本中应用”,该文档链接如下:Gradle 7.2 Doc 下面的示例显示了我如何在settings.gradle.kts文件中应用我的设置插件。按照文档,这是应用设置插件的方式吗?
我也包含了基本的设置插件代码。
我需要你的帮助来澄清我是否做得正确。我相信这篇文章会帮助那些偏离项目插件的其他人。
感谢您的时间和关注。
// settings.gradle.kts

pluginManagement {
    plugins {
        id("com.abitofhelp.gradle.plugins.repositoriesplugin") version "1.0.0-1"
    }

    settings.extensions
        getByType(RepositoriesPluginExtension::class).apply {
            localRepoName = "local-repo"
            localRepositoryPath = "../../local-repo"
        }

    // Set the plugin repositories for all projects.
    //repositories {
    //    maven { name = "localRepo"; url = uri(file("./local-repo")) }
    //    gradlePluginPortal()
    //    mavenCentral()
    //}
}

// repositoriesplugin.kt
open class RepositoriesPlugin: Plugin<Settings> {
    override fun apply(settings: Settings) {
        val extension: RepositoriesPluginExtension =
            settings.extensions.create("repositoriesPlugin", RepositoriesPluginExtension::class.java)

        val localRepositoryName = extension.localRepositoryName?.let { it }?: "../../localRepo"
        val localRepositoryPath = extension.localRepositoryPath?.let { it }?: "../../local-repo"

        settings.pluginManagement.repositories.apply {
            // Set the PLUGIN REPOSITORIES for all subprojects.
            maven { repository ->
                repository.name = localRepositoryName
                repository.url = URI.create(localRepositoryPath)
            }
            gradlePluginPortal()
            mavenCentral()
        }

        settings.dependencyResolutionManagement.repositories.apply {
            // Set the DEPENDENCY REPOSITORIES for all subprojects.
            maven {
                it.name = localRepositoryName
                it.url = URI.create(localRepositoryPath)
            }
            mavenCentral()
            gradlePluginPortal()
        }
    }
}

你的问题是“如何使用本地目录中的插件”吗?因为所有路径设置似乎都是用于仓库声明。 - PrasadU
2
嗨,Prasad,不,问题在于我创建了一个Gradle设置插件(而不是项目插件),并且没有关于如何将其应用/使用到我的构建中的文档。基本上,我如何在我的settings.gradle.kts文件中使用Settings插件?使用项目插件很简单... :) - A Bit of Help
但是您需要什么自定义行为?上面似乎要添加Maven存储库 - 这可以直接通过Gradle设置规范获得 https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_management - PrasadU
PluginAware文档有帮助吗?我认为在任何settings.gradle.kts中,您都可以使用apply { plugin("my.settings.plugin.id") }激活插件。我认为这是因为虽然插件通常用于项目,但它们可以应用于任何对象。恰好项目具有plugins {}块 - 但这是一种特殊情况。 - aSemy
3个回答

4

我刚刚不得不自己解决这个问题。你的初步尝试并没有离谱,但是plugins块实际上必须放在pluginManagement块之后。我的有效实现的基本布局看起来像这样:

// settings.gradle.kts

rootProject.name = "myProject"

pluginManagement {
    repositories {
        maven {
            url = uri("/tmp/maven-local")
            gradlePluginPortal()
        }
    }
}

plugins {
    id("com.example.my-plugin") version "1.0-SNAPSHOT"
}

3
Justin Warkentin所指出的,您需要pluginManagement部分中添加您的存储库,然后像其他插件一样应用您的插件。
如果您想绕过存储库,您还可以通过pluginManagement部分的includeBuild将插件项目作为组合构建添加。
在我的示例中,我结合了两种方法。如果插件项目在本地存在,则使用该项目,否则使用来自存储库的版本。这样,您可以(暂时)将插件项目添加到其中以进行开发并直接在包含项目中进行测试。
pluginManagement {
    repositories {
        // your plugin repo; maybe...
        mavenLocal()
    }

    // use local copy of your plugin if available,
    // otherwise load plugin from repo
    def name = 'your_plugin_project'
    if (file(name).isDirectory()) {
        includeBuild(name)
    }
}

plugins {
    // apply your plugin
    id 'your.plugin.id'
}

1
没想到我可以在pluginManagement内部执行includeBuild。这真是救了我的一天。 - Vibin

0

我认为您需要通过buildscript闭包将插件添加到settings.gradle classpath中。 pluginManagement.plugins使插件可用于根(和子)项目的build.gradle classpath,但我认为这是与settings.gradle脚本不同的classpath。

要添加到settings gradle,请尝试以下操作:

// settings.gradle
    
buildscript {
    repositories {
        maven { url "http://repo.where.plugin.is.published" }
    }

    classpath("complete.maven.coordinates:your-settings-plugin:version")
}

pluginManager.apply(your.settings.plugin.id) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接