[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.testbase.*
import org.jetbrains.kotlin.gradle.util.jsCompilerType import org.jetbrains.kotlin.gradle.util.jsCompilerType
import org.jetbrains.kotlin.gradle.util.normalizePath import org.jetbrains.kotlin.gradle.util.normalizePath
import org.junit.Test
import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.DisabledIf import org.junit.jupiter.api.condition.DisabledIf
@@ -1040,4 +1041,15 @@ class GeneralKotlin2JsGradlePluginIT : KGPBaseTest() {
build("checkIfLastModifiedNotNow", "--rerun-tasks") 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.Plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.attributes.Usage
import org.gradle.api.plugins.BasePlugin 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.MultiplePluginDeclarationDetector
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin 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.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
@@ -48,7 +46,8 @@ open class YarnPlugin : Plugin<Project> {
task.mustRunAfter(rootClean) task.mustRunAfter(rootClean)
} }
tasks.named(KotlinNpmInstallTask.NAME).configure { val kotlinNpmInstall = tasks.named(KotlinNpmInstallTask.NAME)
kotlinNpmInstall.configure {
it.dependsOn(rootPackageJson) it.dependsOn(rootPackageJson)
it.dependsOn(setupTask) it.dependsOn(setupTask)
} }
@@ -57,6 +56,56 @@ open class YarnPlugin : Plugin<Project> {
it.cleanableStoreProvider = provider { yarnRootExtension.requireConfigured().cleanableStore } it.cleanableStoreProvider = provider { yarnRootExtension.requireConfigured().cleanableStore }
it.description = "Clean unused local yarn version" 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 { 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.resolver.implementing
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore
import java.io.File
open class YarnRootExtension( open class YarnRootExtension(
@Transient @Transient
@@ -38,6 +39,8 @@ open class YarnRootExtension(
var command by Property("yarn") var command by Property("yarn")
var download by Property(true) var download by Property(true)
var lockFileName by Property("kotlin-yarn.lock")
var lockFileDirectory: File by Property(project.rootDir)
val yarnSetupTaskProvider: TaskProvider<YarnSetupTask> val yarnSetupTaskProvider: TaskProvider<YarnSetupTask>
get() = project.tasks get() = project.tasks