[Gradle, JS] Get npm dependencies in compilation npm resolver

This commit is contained in:
Ilya Goncharov
2020-06-09 14:49:53 +03:00
parent 49710c9509
commit db42b5b062
4 changed files with 41 additions and 14 deletions
@@ -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)
}
}
}
}
@@ -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<CompilationResolverPlugin> = projectResolver.resolver.plugins
.flatMap {
if (compilation.isMain()) {
@@ -364,4 +384,13 @@ internal class KotlinCompilationNpmResolver(
?: emptyList()
}
}
}
}
/**
* 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<T & R>
*/
private fun <T : Task, R : Any> TaskCollection<T>.implementing(kclass: KClass<R>): TaskCollection<T> =
@Suppress("UNCHECKED_CAST")
withType(kclass.java as Class<T>)
@@ -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<T & R>
*/
private fun <T : Task, R : Any> TaskCollection<T>.implementing(kclass: KClass<R>): TaskCollection<T> =
@Suppress("UNCHECKED_CAST")
withType(kclass.java as Class<T>)
}
@@ -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)
}
}
}
}