Напишите Gradle Plugin, который реагирует на несколько плагинов - PullRequest
3 голосов
/ 12 марта 2019

Я пытаюсь написать новый плагин Gradle, который требует применения двух плагинов: либо java, либо java-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
    }
}

Во втором случае запуск с:

Случай 1: как и ожидалось

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 не был применен.

Знаете ли вы, как настроить плагин для реагирования на несколько приложений плагинов?

...