[Gradle, JS] Detect multiple plugins for NodeJsRootPlugin and YarnPlugin

^KT-39210 fixed
^KT-31669 fixed
This commit is contained in:
Ilya Goncharov
2020-05-28 11:28:07 +03:00
parent 39869f009e
commit 59c2bc25d5
6 changed files with 40 additions and 35 deletions
@@ -24,7 +24,7 @@ internal class KotlinPluginInMultipleProjectsHolder(
val loadedInProjectsPropertyName = getPropertyName(kotlinPluginVersion)
if (!differentVersionsInDifferentProject || loadedInProjectPath == null) {
if (loadedInProjectPath == null) {
loadedInProjectPath = projectPath
val ext = project.rootProject.extensions.getByType(ExtraPropertiesExtension::class.java)
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginInMultipleProjectsHolder
import org.jetbrains.kotlin.gradle.plugin.MULTIPLE_KOTLIN_PLUGINS_LOADED_WARNING
internal object MultiplePluginDeclarationDetector {
private val pluginInMultipleProjectsHolder = KotlinPluginInMultipleProjectsHolder(
differentVersionsInDifferentProject = false
)
fun detect(project: Project) {
pluginInMultipleProjectsHolder
.addProject(project)
if (pluginInMultipleProjectsHolder.isInMultipleProjects(project)) {
error(MULTIPLE_KOTLIN_PLUGINS_LOADED_WARNING)
}
}
}
@@ -10,7 +10,10 @@ import org.gradle.api.Task
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.tasks.TaskProvider
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlatformTestRun
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryType
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
@@ -29,22 +32,6 @@ abstract class KotlinJsIrSubTarget(
) : KotlinJsSubTargetDsl {
val project get() = target.project
init {
val kotlinPluginInMultipleProjectsHolder = KotlinPluginInMultipleProjectsHolder(
differentVersionsInDifferentProject = false
)
val anyProjectAffected = kotlinPluginInMultipleProjectsHolder.getAffectedProjects(project)
?.isNotEmpty() ?: false
if (anyProjectAffected) {
error(MULTIPLE_KOTLIN_PLUGINS_LOADED_WARNING)
}
kotlinPluginInMultipleProjectsHolder
.addProject(project)
}
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
abstract val testTaskDescription: String
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.BasePlugin
import org.jetbrains.kotlin.gradle.targets.js.MultiplePluginDeclarationDetector
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Companion.EXTENSION_NAME
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
@@ -15,6 +16,8 @@ import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
open class NodeJsRootPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run {
MultiplePluginDeclarationDetector.detect(project)
project.plugins.apply(BasePlugin::class.java)
check(project == project.rootProject) {
@@ -10,8 +10,11 @@ import org.gradle.api.Task
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.tasks.TaskProvider
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlatformTestRun
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
@@ -31,22 +34,6 @@ abstract class KotlinJsSubTarget(
) : KotlinJsSubTargetDsl {
val project get() = target.project
init {
val kotlinPluginInMultipleProjectsHolder = KotlinPluginInMultipleProjectsHolder(
differentVersionsInDifferentProject = false
)
val anyProjectAffected = kotlinPluginInMultipleProjectsHolder.getAffectedProjects(project)
?.isNotEmpty() ?: false
if (anyProjectAffected) {
error(MULTIPLE_KOTLIN_PLUGINS_LOADED_WARNING)
}
kotlinPluginInMultipleProjectsHolder
.addProject(project)
}
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
abstract val testTaskDescription: String
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.BasePlugin
import org.jetbrains.kotlin.gradle.targets.js.MultiplePluginDeclarationDetector
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
@@ -15,6 +16,8 @@ import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
open class YarnPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run {
MultiplePluginDeclarationDetector.detect(project)
check(project == project.rootProject) {
"YarnPlugin can be applied only to root project"
}