From 89f8c5a65138e69a4b18310b84533c0ebe99d3b2 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Mon, 31 May 2021 06:05:20 +0300 Subject: [PATCH] [Gradle, JS] Prevent adding unintended implicit dependencies The way JS compilations are mapped to task requirements were changed from `compilation` objects to compilations's `disambiguatedName` in order to support Gradle configuration cache. This may lead to implicitly adding unwanted dependencies in multi-module projects since compilation's `disambiguatedName` is unique within a module, not within a whole multi-module project. #KT-47045 Fixed --- .../gradle/targets/js/nodejs/TasksRequirements.kt | 13 +++++++------ .../js/npm/resolver/KotlinCompilationNpmResolver.kt | 8 +++++--- .../targets/js/npm/tasks/KotlinPackageJsonTask.kt | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt index 3e6cd45620c..531a2a5bdee 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt @@ -19,8 +19,8 @@ class TasksRequirements : Serializable { val byTask: Map> get() = _byTask - internal fun getCompilationNpmRequirements(compilationName: String): Set = - byCompilation[compilationName] + internal fun getCompilationNpmRequirements(projectPath: String, compilationName: String): Set = + byCompilation["$projectPath:$compilationName"] ?: setOf() fun addTaskRequirements(task: RequiresNpmDependencies) { @@ -34,11 +34,12 @@ class TasksRequirements : Serializable { .filterIsInstance() .toMutableSet() - val compilation = task.compilation.disambiguatedName - if (compilation in byCompilation) { - byCompilation[compilation]!!.addAll(requiredNpmDependencies.map { it.toDeclaration() }) + val projectPath = task.compilation.target.project.path + val compilationPath = "$projectPath:${task.compilation.disambiguatedName}" + if (compilationPath in byCompilation) { + byCompilation[compilationPath]!!.addAll(requiredNpmDependencies.map { it.toDeclaration() }) } else { - byCompilation[compilation] = requiredNpmDependencies.map { it.toDeclaration() }.toMutableSet() + byCompilation[compilationPath] = requiredNpmDependencies.map { it.toDeclaration() }.toMutableSet() } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 81439e9e428..967d41436da 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -371,7 +371,8 @@ internal class KotlinCompilationNpmResolver( ) }, externalNpmDependencies.map { it.toDeclaration() }, - fileCollectionDependencies + fileCollectionDependencies, + projectPath ) } @@ -400,7 +401,8 @@ internal class KotlinCompilationNpmResolver( var internalCompositeDependencies: Collection, var externalGradleDependencies: Collection, var externalNpmDependencies: Collection, - var fileCollectionDependencies: Collection + var fileCollectionDependencies: Collection, + val projectPath: String ) : Serializable { private val projectPackagesDir by lazy { compilationResolver.nodeJs.projectPackagesDir } private val rootDir by lazy { compilationResolver.nodeJs.rootProject.rootDir } @@ -454,7 +456,7 @@ internal class KotlinCompilationNpmResolver( .filterNotNull() val toolsNpmDependencies = compilationResolver.rootResolver.nodeJs.taskRequirements - .getCompilationNpmRequirements(compilationResolver.compilationDisambiguatedName) + .getCompilationNpmRequirements(projectPath, compilationResolver.compilationDisambiguatedName) val dukatIfNecessary = if (externalNpmDependencies.any { it.generateExternals }) { setOf( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index 2946f97cc20..6aee976c81f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -68,7 +68,7 @@ open class KotlinPackageJsonTask : DefaultTask() { @get:Input internal val toolsNpmDependencies: List by lazy { nodeJs.taskRequirements - .getCompilationNpmRequirements(compilationDisambiguatedName) + .getCompilationNpmRequirements(projectPath, compilationDisambiguatedName) .map { it.toString() } }