首页 > 解决方案 > 编写一个响应多个插件的 Gradle 插件

问题描述

我正在尝试编写一个新的 Gradle 插件,它需要应用两个插件:要么javajava-library,要么maven-publish。我正在用 Kotlin 编写插件。

我可以按照Gradle 指南轻松地使插件对单个插件应用程序做出反应:

project.plugins.withType(MavenPublishPlugin::class.java) {
    // My stuff
}

但是对于需要两个插件应用程序,我不能做同样的事情:

project.plugins.withType(JavaPlugin::class.java) {
    project.plugins.withType(MavenPublishPlugin::class.java) {
        // My stuff
    }
}

在第二种情况下,启动:

案例一:如预期

plugins {
    id("java")
    id("maven-publish")
    id("org.danilopianini.publish-on-central")
}

按预期运行插件

案例 2:未应用,如预期的那样

使用:

plugins {
    id("java")
    id("org.danilopianini.publish-on-central")
}

正如预期的那样,不应用插件

案例3:应用了,应该没有

但是,最后:

plugins {
    id("maven-publish")
    id("org.danilopianini.publish-on-central")
}

尝试应用插件并失败:

FAILURE: Build failed with an exception.

* Where:
Build file '/tmp/junit876726632157783854/build.gradle.kts' line: 1

* What went wrong:
An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
> Failed to apply plugin [id 'org.danilopianini.publish-on-central']
   > SoftwareComponentInternal with name 'java' not found.

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.plugins.InvalidPluginException: An exception occurred applying plugin request [id: 'org.danilopianini.publish-on-central']
[cut]
Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id 'org.danilopianini.publish-on-central']
    ... 128 more
Caused by: org.gradle.api.UnknownDomainObjectException: SoftwareComponentInternal with name 'java' not found.
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.createNotFoundException(DefaultNamedDomainObjectCollection.java:489)
    at org.gradle.api.internal.DefaultNamedDomainObjectCollection.getByName(DefaultNamedDomainObjectCollection.java:323)

这在我看来是尝试应用插件,不管 Java 插件没有被应用。

您知道任何配置插件以响应多个插件应用程序的方法吗?

标签: gradlepluginskotlinbuild.gradlegradle-plugin

解决方案


推荐阅读