【问题标题】:Gradle 7.2: How to apply a custom Gradle SETTINGS plugin?Gradle 7.2:如何应用自定义 Gradle SETTINGS 插件?
【发布时间】:2021-09-12 07:47:50
【问题描述】:

我正在将 buildSrc 约定插件迁移到独立插件中。有很多为 Project 对象创建 Gradle 插件的示例,但真正缺乏 Settings 和 Gradle。我想集中我们在 gradle.settings.kts 文件中使用的存储库列表,所以我创建了一个 Gradle 设置插件:RepositoriesPlugin。

它在项目插件中以相同的方式实现,但是,我不确定如何解释 Gradle 文档中的以下引用:“插件可以改为接收设置类型的参数,在这种情况下,插件可以是在设置脚本中应用。”,如以下链接中的文档所述: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()
        }
    }
}

【问题讨论】:

  • 您的问题是how to use a plugin from local directory ? 吗?因为所有路径设置似乎都是用于存储库声明。
  • 嗨 Prasad,不,问题是我创建了一个 Gradle 设置插件(不是项目插件),并且没有关于如何在我的构建中应用/使用它的文档。基本上,我如何将设置插件与我的 settings.gradle.kts 文件一起使用?使用项目插件很简单... :)
  • 但是您需要什么自定义行为?上面似乎添加了 maven repo——这可以通过 gradle settings spec docs.gradle.org/current/userguide/… 直接获得
  • PluginAware 文档有帮助吗?我认为在任何settings.gradle.kts 中,您都可以使用apply { plugin("my.settings.plugin.id") } 激活插件。我认为存在不足,因为虽然插件通常用于项目,但它们可以应用于 any 对象。碰巧项目有 plugins {} 块 - 但这是一个特例。

标签: android gradle android-gradle-plugin build.gradle gradle-plugin


【解决方案1】:

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

要添加到设置 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) 

【讨论】:

    【解决方案2】:

    我只需要自己解决这个问题。您最初的尝试并不遥远,但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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多