From 2f8649a337c42fc2d55d4ef787bbb27a3283edab Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 16 Apr 2020 19:19:17 +0300 Subject: [PATCH] [Gradle, JS] up-to-date check on npm install, not on root package.json #KT-34832 fixed --- .../targets/js/nodejs/NodeJsRootExtension.kt | 4 ++++ .../js/npm/KotlinNpmResolutionManager.kt | 24 +++++++++++++++---- .../kotlin/gradle/targets/js/npm/NpmApi.kt | 4 +--- .../js/npm/resolver/KotlinRootNpmResolver.kt | 18 ++------------ .../kotlin/gradle/targets/js/yarn/Yarn.kt | 8 ++----- .../gradle/targets/js/yarn/YarnSimple.kt | 8 ++----- .../gradle/targets/js/yarn/YarnWorkspaces.kt | 16 ++++--------- 7 files changed, 35 insertions(+), 47 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index e6eba53ec7f..0d8ae5bef58 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject 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.yarn.Yarn import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore import java.io.File @@ -56,6 +57,9 @@ open class NodeJsRootExtension(val rootProject: Project) : ConfigurationPhaseAwa val npmInstallTask: KotlinNpmInstallTask get() = rootProject.tasks.getByName(KotlinNpmInstallTask.NAME) as KotlinNpmInstallTask + val rootPackageJsonTask: RootPackageJsonTask + get() = rootProject.tasks.getByName(RootPackageJsonTask.NAME) as RootPackageJsonTask + val rootPackageDir: File get() = rootProject.buildDir.resolve("js") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index e54b4493ea5..1380ca2cb3a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -117,18 +117,33 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension return (state as ResolutionState.Installed).resolved } + val installUpToDate = nodeJsSettings.npmInstallTask.state.upToDate + val forceUpToDate = installUpToDate && !forceFullResolve + val npmResolution = prepareIfNeeded(requireUpToDateReason = reason) val npmResolutions = npmResolution .projects .values + .flatMap { it.npmProjects } + + // we need manual up-to-date checking to avoid call package manager during + // idea import if nothing was changed + // we should call it even kotlinNpmInstall task is up-to-date (skipPackageManager is true) + // because our upToDateChecks saves state for next execution + val upToDateChecks = npmResolutions.map { + PackageJsonUpToDateCheck(it.npmProject) + } + val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate } nodeJsSettings.packageManager.resolveRootProject( nodeJsSettings.rootProject, - npmResolutions.flatMap { it.npmProjects }, - false, + npmResolutions, + upToDate, args ) + upToDateChecks.forEach { it.commit() } + return ResolutionState.Installed((state as ResolutionState.Prepared).resolved) .apply { state = this @@ -166,13 +181,12 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension when (state1) { is ResolutionState.Prepared -> alreadyResolved(state1.resolved) is ResolutionState.Configuring -> { - val upToDate = nodeJsSettings.npmInstallTask.state.upToDate + val upToDate = nodeJsSettings.rootPackageJsonTask.state.upToDate if (requireUpToDateReason != null && !upToDate) { error("NPM dependencies should be resolved $requireUpToDateReason") } - val forceUpToDate = upToDate && !forceFullResolve - state1.resolver.close(forceUpToDate).also { + state1.resolver.close().also { this.state = ResolutionState.Prepared(it) state1.resolver.closePlugins(it) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt index e775b01737c..8d751d7486c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt @@ -19,9 +19,7 @@ interface NpmApi { fun prepareRootProject( rootProject: Project, - subProjects: Collection, - skipExecution: Boolean, - cliArgs: List + subProjects: Collection ) fun resolveRootProject( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index f7832d22e90..2d988292e4b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.npm.CompositeNodeModulesCache import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModulesCache import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager -import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJsonUpToDateCheck import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.RootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution @@ -88,7 +87,7 @@ internal class KotlinRootNpmResolver internal constructor( /** * Don't use directly, use [KotlinNpmResolutionManager.installIfNeeded] instead. */ - internal fun close(forceUpToDate: Boolean): KotlinRootNpmResolution { + internal fun close(): KotlinRootNpmResolution { check(!closed) closed = true @@ -99,24 +98,11 @@ internal class KotlinRootNpmResolver internal constructor( gradleNodeModules.close() - // we need manual up-to-date checking to avoid call package manager during - // idea import if nothing was changed - // we should call it even kotlinNpmInstall task is up-to-date (skipPackageManager is true) - // because our upToDateChecks saves state for next execution - val upToDateChecks = allNpmPackages.map { - PackageJsonUpToDateCheck(it.npmProject) - } - val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate } - nodeJs.packageManager.prepareRootProject( rootProject, - allNpmPackages, - upToDate, - nodeJs.npmInstallTask.args + allNpmPackages ) - upToDateChecks.forEach { it.commit() } - return KotlinRootNpmResolution( rootProject, projectResolutions, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index fcd6d475dcf..d76911c3523 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -47,14 +47,10 @@ class Yarn : NpmApi { override fun prepareRootProject( rootProject: Project, - subProjects: Collection, - skipExecution: Boolean, - cliArgs: List + subProjects: Collection ) = getDelegate(rootProject.project) .prepareRootProject( rootProject, - subProjects, - skipExecution, - cliArgs + subProjects ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt index c133fd68b09..79d550bfd9a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt @@ -32,14 +32,10 @@ class YarnSimple : YarnBasics() { npmProjects: Collection, skipExecution: Boolean, cliArgs: List - ) { - TODO("Not yet implemented") - } + ) = Unit override fun prepareRootProject( rootProject: Project, - subProjects: Collection, - skipExecution: Boolean, - cliArgs: List + subProjects: Collection ) = Unit } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt index 9939914a535..a44c435b300 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt @@ -17,30 +17,24 @@ class YarnWorkspaces : YarnBasics() { override fun prepareRootProject( rootProject: Project, - subProjects: Collection, - skipExecution: Boolean, - cliArgs: List + subProjects: Collection ) { check(rootProject == rootProject.rootProject) - if (!skipExecution) setup(rootProject) + setup(rootProject) return prepareRootPackageJson( rootProject, - subProjects, - skipExecution + subProjects ) } private fun prepareRootPackageJson( rootProject: Project, - npmProjects: Collection, - skipExecution: Boolean + npmProjects: Collection ) { val nodeJs = NodeJsRootPlugin.apply(rootProject) val rootPackageJsonFile = nodeJs.rootPackageJson - if (!skipExecution) { - saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile) - } + saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile) } override fun resolveRootProject(