[Gradle, JS] Persist yarn lock by default

^KT-34014 fixed
^KT-49505 fixed
This commit is contained in:
Ilya Goncharov
2021-10-26 17:40:47 +03:00
committed by Space
parent b11f2fb2af
commit a03f346296
3 changed files with 69 additions and 5 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.gradle.tasks.USING_JS_IR_BACKEND_MESSAGE
import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.jsCompilerType
import org.jetbrains.kotlin.gradle.util.normalizePath
import org.junit.Test
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.DisabledIf
@@ -1040,4 +1041,15 @@ class GeneralKotlin2JsGradlePluginIT : KGPBaseTest() {
build("checkIfLastModifiedNotNow", "--rerun-tasks")
}
}
@DisplayName("Yarn.lock persistence")
@GradleTest
fun testYarnLockStore() = with(transformProjectWithPluginsDsl("cleanTask")) {
build("assemble") {
assertSuccessful()
assertFileExists("kotlin-yarn.lock")
assert(fileInWorkingDir("kotlin-yarn.lock").readText() == fileInWorkingDir("build/js/yarn.lock").readText())
}
}
}
@@ -7,13 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.attributes.Usage
import org.gradle.api.plugins.BasePlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.targets.js.MultiplePluginDeclarationDetector
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.implementing
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
@@ -48,7 +46,8 @@ open class YarnPlugin : Plugin<Project> {
task.mustRunAfter(rootClean)
}
tasks.named(KotlinNpmInstallTask.NAME).configure {
val kotlinNpmInstall = tasks.named(KotlinNpmInstallTask.NAME)
kotlinNpmInstall.configure {
it.dependsOn(rootPackageJson)
it.dependsOn(setupTask)
}
@@ -57,6 +56,56 @@ open class YarnPlugin : Plugin<Project> {
it.cleanableStoreProvider = provider { yarnRootExtension.requireConfigured().cleanableStore }
it.description = "Clean unused local yarn version"
}
val packageJsonUmbrella = nodeJs
.packageJsonUmbrellaTaskProvider
yarnRootExtension.rootPackageJsonTaskProvider.configure {
it.dependsOn(packageJsonUmbrella)
}
project.allprojects
.forEach {
it.tasks.implementing(RequiresNpmDependencies::class).all {}
}
val storeYarnLock = tasks.register("kotlinStoreYarnLock") {
it.dependsOn(kotlinNpmInstall)
val yarnLock = nodeJs.rootPackageDir.resolve("yarn.lock")
it.doLast {
copy { copy ->
copy.from(yarnLock)
copy.rename { yarnRootExtension.lockFileName }
copy.into(yarnRootExtension.lockFileDirectory)
}
}
it.inputs.file(yarnLock).withPropertyName("inputFile")
it.outputs.file(yarnRootExtension.lockFileDirectory.resolve(yarnRootExtension.lockFileName)).withPropertyName("outputFile")
}
val restoreYarnLock = tasks.register("kotlinRestoreYarnLock") {
val lockFile = yarnRootExtension.lockFileDirectory.resolve(yarnRootExtension.lockFileName)
it.onlyIf {
lockFile.exists()
}
it.doLast {
copy { copy ->
copy.from(lockFile)
copy.rename { "yarn.lock" }
copy.into(nodeJs.rootPackageDir)
}
}
it.inputs.file(lockFile).withPropertyName("inputFile")
it.outputs.file(nodeJs.rootPackageDir.resolve("yarn.lock")).withPropertyName("outputFile")
}
kotlinNpmInstall.configure {
it.dependsOn(restoreYarnLock)
it.finalizedBy(storeYarnLock)
}
}
companion object {
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.implementing
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore
import java.io.File
open class YarnRootExtension(
@Transient
@@ -38,6 +39,8 @@ open class YarnRootExtension(
var command by Property("yarn")
var download by Property(true)
var lockFileName by Property("kotlin-yarn.lock")
var lockFileDirectory: File by Property(project.rootDir)
val yarnSetupTaskProvider: TaskProvider<YarnSetupTask>
get() = project.tasks