From 21249a1dcb0d53820c38c2431747a625f0e64c48 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 27 Oct 2021 22:12:43 +0300 Subject: [PATCH] [Gradle, JS] Use separate task class for good configuration caching ^KT-34014 fixed ^KT-49505 fixed --- .../targets/js/yarn/YarnLockCopyTask.kt | 45 +++++++++++++++++++ .../gradle/targets/js/yarn/YarnPlugin.kt | 32 ++++--------- 2 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLockCopyTask.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLockCopyTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLockCopyTask.kt new file mode 100644 index 00000000000..f8dbcd64bdc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLockCopyTask.kt @@ -0,0 +1,45 @@ +/* + * 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.targets.js.yarn + +import org.gradle.api.DefaultTask +import org.gradle.api.file.FileSystemOperations +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.* +import java.io.File +import javax.inject.Inject + +abstract class YarnLockCopyTask : DefaultTask() { + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val inputFile: RegularFileProperty + + @get:Internal + abstract val outputDirectory: RegularFileProperty + + @get:Internal + abstract val fileName: Property + + @get:OutputFile + val outputFile: Provider + get() = outputDirectory.map { regularFile -> + regularFile.asFile.resolve(fileName.get()) + } + + @get:Inject + abstract val fs: FileSystemOperations + + @TaskAction + fun copy() { + fs.copy { copy -> + copy.from(inputFile) + copy.rename { fileName.get() } + copy.into(outputDirectory) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt index 5f65a1391a2..a7f79926940 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt @@ -79,37 +79,21 @@ open class YarnPlugin : Plugin { } } - val storeYarnLock = tasks.register("kotlinStoreYarnLock") { + val storeYarnLock = tasks.register("kotlinStoreYarnLock", YarnLockCopyTask::class.java) { 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") + it.inputFile.set(nodeJs.rootPackageDir.resolve("yarn.lock")) + it.outputDirectory.set(yarnRootExtension.lockFileDirectory) + it.fileName.set(yarnRootExtension.lockFileName) } - val restoreYarnLock = tasks.register("kotlinRestoreYarnLock") { + val restoreYarnLock = tasks.register("kotlinRestoreYarnLock", YarnLockCopyTask::class.java) { val lockFile = yarnRootExtension.lockFileDirectory.resolve(yarnRootExtension.lockFileName) + it.inputFile.set(yarnRootExtension.lockFileDirectory.resolve(yarnRootExtension.lockFileName)) + it.outputDirectory.set(nodeJs.rootPackageDir) + it.fileName.set("yarn.lock") 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 {