From db42b5b06264a4e242d38f0857078271008946b1 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 9 Jun 2020 14:49:53 +0300 Subject: [PATCH] [Gradle, JS] Get npm dependencies in compilation npm resolver --- .../targets/js/ir/KotlinJsIrSubTarget.kt | 5 +++ .../resolver/KotlinCompilationNpmResolver.kt | 31 ++++++++++++++++++- .../npm/resolver/KotlinProjectNpmResolver.kt | 14 +-------- .../js/subtargets/KotlinJsSubTarget.kt | 5 +++ 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index 4819b646467..37ca76135d9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -141,6 +142,10 @@ abstract class KotlinJsIrSubTarget( if (it.testFramework == null) { configureDefaultTestFramework(it) } + + if (it.enabled) { + nodeJs.taskRequirements.addTaskRequirements(it as RequiresNpmDependencies) + } } } } 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 acbe6f7fc57..2c854ffc037 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver +import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency @@ -14,6 +15,7 @@ import org.gradle.api.initialization.IncludedBuild import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.TaskCollection import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.Zip import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation @@ -30,12 +32,14 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_J import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.CompilationResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask +import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.utils.CompositeProjectComponentArtifactMetadata import org.jetbrains.kotlin.gradle.utils.`is` import org.jetbrains.kotlin.gradle.utils.topRealPath import java.io.File import java.io.Serializable +import kotlin.reflect.KClass /** * See [KotlinNpmResolutionManager] for details about resolution process. @@ -70,6 +74,22 @@ internal class KotlinCompilationNpmResolver( } } + init { + project.tasks.implementing(RequiresNpmDependencies::class) + .configureEach { task -> + if (task.enabled) { + task as RequiresNpmDependencies + // KotlinJsTest delegates npm dependencies to testFramework, + // which can be defined after this configure action + if (task !is KotlinJsTest) { + nodeJs.taskRequirements.addTaskRequirements(task) + } + task.dependsOn(packageJsonTaskHolder) + task.dependsOn(nodeJs.npmInstallTask) + } + } + } + val plugins: List = projectResolver.resolver.plugins .flatMap { if (compilation.isMain()) { @@ -364,4 +384,13 @@ internal class KotlinCompilationNpmResolver( ?: emptyList() } } -} \ No newline at end of file +} + +/** + * Filters a [TaskCollection] by type that is not a subtype of [Task] (for use with interfaces) + * + * TODO properly express within the type system? The result should be a TaskCollection + */ +private fun TaskCollection.implementing(kclass: KClass): TaskCollection = + @Suppress("UNCHECKED_CAST") + withType(kclass.java as Class) \ 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/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index a33ea8cded5..fa80db8ac70 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -6,8 +6,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskCollection import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtensionOrNull @@ -16,7 +14,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution -import kotlin.reflect.KClass /** * See [KotlinNpmResolutionManager] for details about resolution process. @@ -95,13 +92,4 @@ internal class KotlinProjectNpmResolver( resolver.nodeJs.taskRequirements.byTask ) } -} - -/** - * Filters a [TaskCollection] by type that is not a subtype of [Task] (for use with interfaces) - * - * TODO properly express within the type system? The result should be a TaskCollection - */ -private fun TaskCollection.implementing(kclass: KClass): TaskCollection = - @Suppress("UNCHECKED_CAST") - withType(kclass.java as Class) \ No newline at end of file +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt index c618095654b..0c872226cde 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -131,6 +132,10 @@ abstract class KotlinJsSubTarget( if (it.testFramework == null) { configureDefaultTestFramework(it) } + + if (it.enabled) { + nodeJs.taskRequirements.addTaskRequirements(it as RequiresNpmDependencies) + } } } }