我阅读了这个答案,但据我了解,它不适用于较新版本的 Gradle。
前提条件:
我用 build.gradle 创建了插件
buildscript {
dependencies {
classpath 'ru.vyarus:gradle-quality-plugin:4.9.0' // it's just a try to provide dependency throught plugin
}
}
plugins {
id 'java-gradle-plugin'
id 'groovy'
id 'maven-publish'
}
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
gradlePlugin {
plugins {
create('base-configurer-plugin') {
id = 'com.test.gradle.base-configurer-plugin'
implementationClass = 'com.test.BaseGradlePlugin'
}
}
}
dependencies {
compileOnly 'ru.vyarus:gradle-quality-plugin:4.9.0' // added for possibility to import in custom plugin code
}
以及插件代码
@Override
void apply(Project project) {
project.dependencies {
implementation 'ru.vyarus:gradle-quality-plugin:4.9.0'
}
project.pluginManager.apply(QualityPlugin) // I tried many ways to apply with manipulating this apply() method
}
但是当我尝试从其他项目应用此插件时出现错误:
Unable to load class 'ru.vyarus.gradle.plugin.quality.QualityPlugin'
ru.vyarus.gradle.plugin.quality.QualityPlugin
我还尝试通过runtimeClasspath添加依赖项,但遇到了另一个错误:
> Dependencies can not be declared against the `runtimeClasspath` configuration.
runtime() 也不起作用
Gradle DSL method not found: 'runtime()'
所以我的问题是:
如何从自定义 Gradle 插件中添加插件及其依赖项?
非常感谢您的宝贵时间
要从您自己的自定义插件应用外部插件,您需要:
Project
对象可用的几种方法之一来应用外部插件。在这里,您需要找到外部插件 JAR 的 Maven 坐标,并将它们添加到插件项目的
build.gradle
文件中,就像任何其他 Gradle 项目的任何其他依赖项一样。
这里你应该写:
dependencies {
implementation 'ru.vyarus:gradle-quality-plugin:4.9.0'
}
您使用
implementation
配置,而不是 compileOnly
,因为您在运行时需要类路径上的代码。
Gradle 将在您在
repositories
块中指定的存储库中查找此依赖项。我看到这个工件在 Maven Central 和 Gradle Plugin Portal 上都可用,因此使用任一存储库都应该足够了(您已指定两者)1。
此外,代码不需要位于插件项目的构建脚本的类路径上(因此没有构建脚本块)或自定义插件将应用到的项目的类路径(因此在您的代码中不要使用
project.dependencies
)自定义插件)。
一旦外部插件的代码可供自定义插件使用,您就可以告诉 Gradle 将其应用到您的自定义插件代码中(即在您自己的
apply
方法中)。推荐的方法是使用 PluginManager
对象上的方法之一。
编写 Groovy 代码,可以是:
project.pluginManager.apply('ru.vyarus.quality')
或者:
// with import ru.vyarus.gradle.plugin.quality.QualityPlugin
project.pluginManager.apply(QualityPlugin::class)
1任何此类存储库也必须可用于您选择应用自定义插件的任何项目的
plugins
块。但是,由于自定义插件可在 Gradle 插件门户中使用,并且默认情况下 Gradle 插件门户可作为 plugins
块的存储库,因此这应该不是问题。