From fb6eb414ad487398b219ccce453fd9f58ca8c5b2 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 15 Nov 2021 17:27:29 +0300 Subject: [PATCH] [Gradle, JS] Fix afterEvaluate not inside task configuration --- .../gradle/targets/js/yarn/YarnPlugin.kt | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) 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 546c63076c2..6c237e575ce 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.BasePlugin +import org.gradle.api.tasks.TaskProvider 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 @@ -44,30 +45,10 @@ open class YarnPlugin : Plugin { task.description = "Create root package.json" task.mustRunAfter(rootClean) - - // Yes, we need to break Task Configuration Avoidance here - // In case when we need to create package.json's files and execute kotlinNpmInstall, - // We need to configure all RequiresNpmDependencies tasks to install them, - // Because we need to persist yarn.lock - // We execute this block in configure phase of rootPackageJson to be sure, - // That Task Configuration Avoidance will not be broken for tasks not related with NPM installing - // https://youtrack.jetbrains.com/issue/KT-48241 - project.allprojects - .forEach { - val fn: (Project) -> Unit = { - it.tasks.implementing(RequiresNpmDependencies::class) - .forEach {} - } - if (it.state.executed) { - fn(it) - } else { - it.afterEvaluate { - fn(it) - } - } - } } + configureRequiresNpmDependencies(project, rootPackageJson) + val kotlinNpmInstall = tasks.named(KotlinNpmInstallTask.NAME) kotlinNpmInstall.configure { it.dependsOn(rootPackageJson) @@ -109,6 +90,42 @@ open class YarnPlugin : Plugin { } } + // Yes, we need to break Task Configuration Avoidance here + // In case when we need to create package.json's files and execute kotlinNpmInstall, + // We need to configure all RequiresNpmDependencies tasks to install them, + // Because we need to persist yarn.lock + // We execute this block in configure phase of rootPackageJson to be sure, + // That Task Configuration Avoidance will not be broken for tasks not related with NPM installing + // https://youtrack.jetbrains.com/issue/KT-48241 + private fun configureRequiresNpmDependencies( + project: Project, + rootPackageJson: TaskProvider + ) { + val fn: (Project) -> Unit = { + it.tasks.implementing(RequiresNpmDependencies::class) + .forEach {} + } + rootPackageJson.configure { + project.allprojects + .forEach { project -> + if (it.state.executed) { + fn(project) + } + } + } + + project.allprojects + .forEach { + if (!it.state.executed) { + it.afterEvaluate { project -> + rootPackageJson.configure { + fn(project) + } + } + } + } + } + companion object { fun apply(project: Project): YarnRootExtension { val rootProject = project.rootProject