[Gradle, JS] Fix configuration cache for NodeJsExec and D8Exec

^KT-58250 fixed
^KT-58256 fixed
This commit is contained in:
Ilya Goncharov
2023-05-01 20:15:37 +00:00
committed by Space Team
parent 83db4a06d9
commit f8c51dcfee
6 changed files with 111 additions and 18 deletions
@@ -127,6 +127,29 @@ abstract class AbstractJsConfigurationCacheIT(protected val irBackend: Boolean)
)
}
}
@DisplayName("Node.js run correctly works with configuration cache")
@GradleTest
fun testNodeJsRun(gradleVersion: GradleVersion) {
project("kotlin-js-nodejs-project", gradleVersion) {
build("nodeRun", buildOptions = buildOptions) {
assertTasksExecuted(":nodeRun")
assertOutputContains(
"Calculating task graph as no configuration cache is available for tasks: nodeRun"
)
assertConfigurationCacheStored()
}
build("clean", buildOptions = buildOptions)
// Then run a build where tasks states are deserialized to check that they work correctly in this mode
build("nodeRun", buildOptions = buildOptions) {
assertTasksExecuted(":nodeRun")
assertConfigurationCacheReused()
}
}
}
}
@JsGradlePluginTests
@@ -0,0 +1,55 @@
/*
* Copyright 2010-2021 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
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
@MppGradlePluginTests
class WasmConfigurationCacheIT : KGPBaseTest() {
override val defaultBuildOptions =
super.defaultBuildOptions.copy(
configurationCache = true,
)
@DisplayName("configuration cache is working for wasm")
@GradleTest
fun testKotlinWasmCompilation(gradleVersion: GradleVersion) {
project("wasm-d8-simple-project", gradleVersion) {
assertSimpleConfigurationCacheScenarioWorks(
"assemble",
buildOptions = defaultBuildOptions,
executedTaskNames = listOf(":compileKotlinWasm")
)
}
}
@DisplayName("D8 run correctly works with configuration cache")
@GradleTest
@GradleTestVersions(minVersion = TestVersions.Gradle.G_7_6)
fun testD8Run(gradleVersion: GradleVersion) {
project("wasm-d8-simple-project", gradleVersion) {
build("wasmD8Run", buildOptions = buildOptions) {
assertTasksExecuted(":wasmD8Run")
assertOutputContains(
"Calculating task graph as no configuration cache is available for tasks: wasmD8Run"
)
assertConfigurationCacheStored()
}
build("clean", buildOptions = buildOptions)
// Then run a build where tasks states are deserialized to check that they work correctly in this mode
build("wasmD8Run", buildOptions = buildOptions) {
assertTasksExecuted(":wasmD8Run")
assertConfigurationCacheReused()
}
}
}
}
@@ -0,0 +1,16 @@
plugins {
id("org.jetbrains.kotlin.multiplatform")
}
repositories {
mavenLocal()
mavenCentral()
}
kotlin {
wasm {
binaries.executable()
d8 {
}
}
}
@@ -0,0 +1,8 @@
/*
* Copyright 2010-2023 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.
*/
fun main() {
println("Hello, world")
}
@@ -13,17 +13,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.newFileProperty
import javax.inject.Inject
open class D8Exec
@Inject
constructor(
private val compilation: KotlinJsCompilation
) : AbstractExecTask<D8Exec>(D8Exec::class.java) {
@Transient
@get:Internal
lateinit var d8: D8RootExtension
open class D8Exec : AbstractExecTask<D8Exec>(D8Exec::class.java) {
init {
onlyIf {
!inputFileProperty.isPresent || inputFileProperty.asFile.map { it.exists() }.get()
@@ -45,9 +36,7 @@ constructor(
if (inputFileProperty.isPresent) {
val inputFile = inputFileProperty.asFile.get()
workingDir = inputFile.parentFile
if (compilation.target.platformType == KotlinPlatformType.wasm) {
newArgs.add("--module")
}
newArgs.add("--module")
newArgs.add(inputFile.canonicalPath)
}
args?.let {
@@ -70,10 +59,8 @@ constructor(
val project = target.project
val d8 = D8RootPlugin.apply(project.rootProject)
return project.registerTask(
name,
listOf(compilation)
name
) {
it.d8 = d8
it.executable = d8.requireConfigured().executablePath.absolutePath
it.dependsOn(d8.setupTaskProvider)
it.dependsOn(compilation.compileKotlinTaskProvider)
@@ -23,12 +23,16 @@ open class NodeJsExec
@Inject
constructor(
@Internal
override val compilation: KotlinJsCompilation
@Transient
override val compilation: KotlinJsCompilation,
) : AbstractExecTask<NodeJsExec>(NodeJsExec::class.java), RequiresNpmDependencies {
@Transient
@get:Internal
lateinit var nodeJs: NodeJsRootExtension
@Internal
val npmProject = compilation.npmProject
init {
onlyIf {
!inputFileProperty.isPresent || inputFileProperty.asFile.map {
@@ -70,7 +74,7 @@ constructor(
if (sourceMapStackTraces) {
val sourceMapSupportArgs = mutableListOf(
"--require",
compilation.npmProject.require("source-map-support/register.js")
npmProject.require("source-map-support/register.js")
)
args?.let { sourceMapSupportArgs.addAll(it) }