如何在多模块项目中构建和使用gradle插件?

jogvjijk  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(247)

全局
我有一个库,在其他项目中被用作依赖项。每个项目都有一些与test suites相关的公共配置,这些配置依赖于我的库。这就是为什么我创建了一个plugin,它为我配置了这些配置,这样我就可以添加插件并完成它:

plugins {
   id("org.my.gradle.plugin") version "internal"
}

项目结构

+ root
  + my-api/... (self-sustained; doesn't depend on anything, pretty much interfaces)
  + my-implementation/... (depends on my-api and `my-gradle-plugin` via `plugins { id("org.my.plugin") }`)
  + my-gradle-plugin/... (the plugin itself)
    + build.gradle.kts
      plugins {
        `java-gradle-plugin`
        `maven-publish`
      }

      gradlePlugin {
          plugins {
              create("org.my.gradle.plugin") {
                  id = "org.my.gradle.plugin"
                  group = "org.my.gradle.plugin"
                  implementationClass = "org.my.gradle.plugin.MyGradlePlugin"
                  version = project.version
              }
          }
      }

  + build.gradle.kts // a bunch of shared task configurations and some repository configuration (mavenLocal, maven(xyz), mavenCentral())
  + gradle.properties - contains only "version=0.0.3-SNAPSHOT"
  + settings.gradle.kts
    pluginManagement {
        repositories {
            mavenLocal()
            maven { url = uri("https://xyz") }
            gradlePluginPortal()
            mavenCentral()
        }
        resolutionStrategy {
            val version: String by settings
            eachPlugin {
                if (requested.id.id == "org.my.gradle.plugin") {
                    useVersion(version)
                }
            }
        }
    }

问题

如果是一个独立的项目,这个插件可以很好的工作。不幸的是,这使我的工作流程变得复杂,所以我想我可以在同一个多模块项目中使用它。
不幸的是,我遇到了问题,因为gradle似乎不知道它需要构建plugin,以便在其中一个模块中构建use,因此我得到:

* Where:
Build file '/workspace/my-implementation/build.gradle.kts' line: 3

* What went wrong:
Plugin [id: 'org.my.gradle.plugin', version: '0.0.3-SNAPSHOT'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'org.my.gradle.plugin:org.my.gradle.plugin.gradle.plugin:0.0.3-SNAPSHOT')
  Searched in the following repositories:
    MavenLocal(file:/home/jenkins/.m2/repository/)
    maven(https://xyz)
    Gradle Central Plugin Repository
    MavenRepo

为什么会失败?

我知道spring-boot-gralde-plugin是spring Boot 多模块gradle项目的一部分,并且在项目本身中使用。不幸的是,我还没能弄清楚什么是使它工作的“魔术”。
你知道我错过了什么吗

wkyowqbh

wkyowqbh1#

我花了大半天的时间,但我终于弄明白了。
为了在同一个仓库中使用插件,你必须在你的plugin中放置一个settings.gradle.kts文件。这将plugin构建与你的其他模块分开。然后你可以在pluginManagement中使用includeBuild()来强制插件的构建先于其他一切:

// ./root/settings.kotlin.kts

rootProject.name = "root-project"

include("my-api", "my-implementation")

pluginManagement {
    includeBuild("my-gradle-plugin")
    repositories {
        mavenLocal()
        maven { url = uri("https://xyz") }
        gradlePluginPortal()
        mavenCentral()
    }
    resolutionStrategy {
        val version: String by settings
        eachPlugin {
            if (requested.id.id == "org.my.gradle.plugin") {
                useVersion(version)
            }
        }
    }
}

然后,您可以使用插件没有任何问题:

plugins {
   id("org.my.gradle.plugin") version "internal"
}

我正在使用gradle 7.5+,所以不确定这是否适用于旧版本。
这些文档还在此处提到:https://docs.gradle.org/7.6/userguide/composite_builds.html#included_plugin_builds

相关问题