Gradle, js: create one npmResolve per build (share between subprojects)

#KT-30530
This commit is contained in:
Sergey Rostov
2019-05-15 20:05:21 +03:00
parent 8166cfb054
commit 09e81ddd21
11 changed files with 27 additions and 37 deletions
@@ -14,16 +14,13 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolveTask
import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinBrowserJs
import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinNodeJs
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.testing.internal.getAggregatedTestTask
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
class KotlinJsTarget(project: Project, platformType: KotlinPlatformType) :
KotlinOnlyTarget<KotlinJsCompilation>(project, platformType), KotlinJsTargetDsl {
val npmResolveTaskHolder = project.locateOrRegisterTask<NpmResolveTask>("npmResolve") {}
val testTaskName get() = lowerCamelCaseName(disambiguationClassifier, testTaskNameSuffix)
val testTask
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.api.plugins.JavaBasePlugin
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsSourceSetProcessor
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) :
@@ -22,7 +22,7 @@ open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) :
super.configureTarget(target)
target.compilations.forEach {
it.compileKotlinTask.dependsOn(target.npmResolveTaskHolder.getTaskOrProvider())
it.compileKotlinTask.dependsOn(target.project.nodeJs.root.npmResolveTask)
}
if (target.disambiguationClassifier != null) {
@@ -6,33 +6,12 @@
package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.tasks.AbstractExecTask
import org.gradle.api.tasks.Internal
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import java.io.File
open class NodeJsExec : AbstractExecTask<NodeJsExec>(NodeJsExec::class.java) {
private val npmProject by lazy { project.npmProject }
init {
val nodeJs = NodeJsPlugin.apply(project).root
dependsOn(nodeJs.nodeJsSetupTask)
dependsOn(nodeJs.npmResolveTask)
executable = nodeJs.environment.nodeExecutable
workingDir = project.npmProject.nodeWorkDir
}
@Internal
var script: String? = null
fun require(moduleName: String) {
args("--require", moduleName)
}
fun script(file: File) {
check(script == null) {
"Script was already set to $script"
}
script = file.canonicalFile.relativeToOrSelf(npmProject.nodeWorkDir).path
}
}
@@ -5,6 +5,7 @@ import org.gradle.api.Project
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.Delete
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Companion.NODE_JS
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolveTask
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
open class NodeJsPlugin : Plugin<Project> {
@@ -14,7 +15,12 @@ open class NodeJsPlugin : Plugin<Project> {
}
this.extensions.create(NODE_JS, NodeJsRootExtension::class.java, this)
tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java)
val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java)
val npmResolveTask = tasks.create(NpmResolveTask.NAME, NpmResolveTask::class.java)
npmResolveTask.outputs.upToDateWhen { false }
npmResolveTask.dependsOn(setupTask)
setupCleanNodeModulesTask(project)
@@ -2,9 +2,12 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectLayout
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolveTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import java.io.File
open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) {
@@ -26,6 +29,9 @@ open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) {
val nodeJsSetupTask: NodeJsSetupTask
get() = project.tasks.getByName(NodeJsSetupTask.NAME) as NodeJsSetupTask
val npmResolveTask: NpmResolveTask
get() = project.tasks.getByName(NpmResolveTask.NAME) as NpmResolveTask
internal val environment: NodeJsEnv
get() {
val platform = NodeJsPlatform.name
@@ -13,4 +13,8 @@ open class NpmResolveTask : AbstractTask() {
fun resolve() {
NpmResolver.resolve(project)
}
companion object {
const val NAME = "npmResolve"
}
}
@@ -43,7 +43,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
val compileKotlinTask = compilation.compileKotlinTask
it.dependsOn(target.npmResolveTaskHolder.getTaskOrProvider(), compileKotlinTask)
it.dependsOn(target.project.nodeJs.root.npmResolveTask, compileKotlinTask)
it.entry = npmProject.compileOutput(compileKotlinTask)
@@ -53,7 +53,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
val run = project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("run")) {
val compileKotlinTask = compilation.compileKotlinTask
it.dependsOn(
target.npmResolveTaskHolder.getTaskOrProvider(),
target.project.nodeJs.root.npmResolveTask,
compileKotlinTask,
project.getTasksByName(compilation.processResourcesTaskName, false)
)
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
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.NodeJsPlugin
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
@@ -65,7 +66,7 @@ abstract class KotlinJsSubTarget(
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
testJs.dependsOn(target.npmResolveTaskHolder.getTaskOrProvider(), compileTask, nodeJs.nodeJsSetupTask)
testJs.dependsOn(target.project.nodeJs.root.npmResolveTask, compileTask, nodeJs.nodeJsSetupTask)
testJs.onlyIf {
compileTask.outputFile.exists()
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
@@ -32,7 +33,7 @@ class KotlinNodeJs(target: KotlinJsTarget) :
val runTaskHolder = project.createOrRegisterTask<NodeJsExec>(disambiguateCamelCased("run")) { runTask ->
val compileKotlinTask = compilation.compileKotlinTask
runTask.dependsOn(target.npmResolveTaskHolder.getTaskOrProvider(), compileKotlinTask)
runTask.dependsOn(target.project.nodeJs.root.npmResolveTask, compileKotlinTask)
val npmProject = project.npmProject
runTask.args(npmProject.compileOutput(compileKotlinTask))
@@ -52,7 +53,7 @@ class KotlinNodeJs(target: KotlinJsTarget) :
runtimeOnly(kotlin("test-nodejs-runner"))
}
target.npmResolveTaskHolder.doGetTask().doLast {
target.project.nodeJs.root.npmResolveTask.doLast {
runTaskHolder.configure { runTask ->
runTask.args(
"--require",
@@ -12,7 +12,6 @@ import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.process.internal.DefaultProcessForkOptions
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.*
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolver
@@ -6,9 +6,6 @@
package org.jetbrains.kotlin.gradle.targets.js.yarn
import org.gradle.api.Project
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.internal.hash.FileHasher
import org.jetbrains.kotlin.daemon.common.toHexString
import org.jetbrains.kotlin.gradle.internal.execWithProgress
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.*