From 88fa396d26194cf9b8bc8b5aed328108bf04f233 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Sun, 7 Jul 2019 17:28:25 +0300 Subject: [PATCH] Gradle, js, resolver: don't skip reading lock file while skipping package manager execution --- .../js/npm/KotlinNpmResolutionManager.kt | 5 ++-- .../kotlin/gradle/targets/js/npm/NpmApi.kt | 3 ++- .../js/npm/resolver/KotlinRootNpmResolver.kt | 25 ++++++++----------- .../kotlin/gradle/targets/js/yarn/Yarn.kt | 7 ++++-- .../gradle/targets/js/yarn/YarnSimple.kt | 6 ++++- .../gradle/targets/js/yarn/YarnWorkspaces.kt | 19 +++++++++----- 6 files changed, 37 insertions(+), 28 deletions(-) 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 bbc8619efd9..dcbb4d786ca 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 @@ -9,7 +9,6 @@ import org.gradle.api.Incubating import org.gradle.api.Project import org.gradle.api.Task import org.jetbrains.kotlin.gradle.internal.isInIdeaSync -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution @@ -129,8 +128,8 @@ class KotlinNpmResolutionManager(val nodeJsSettings: NodeJsRootExtension) { error("NPM dependencies should be resolved $requireUpToDateReason") } - val skipPackageManager = upToDate && !forceFullResolve - state1.resolver.close(skipPackageManager).also { + val forceUpToDate = upToDate && !forceFullResolve + state1.resolver.close(forceUpToDate).also { this.state = ResolutionState.Installed(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 c6375b2afaa..bb8bb86d542 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 @@ -18,7 +18,8 @@ interface NpmApi { fun resolveRootProject( rootProject: Project, - subProjects: Collection + subProjects: Collection, + skipExecution: Boolean ) companion object { 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 7d5b5104d59..0ea857fb862 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 @@ -62,7 +62,7 @@ internal class KotlinRootNpmResolver internal constructor( /** * Don't use directly, use [NodeJsRootExtension.resolveIfNeeded] instead. */ - internal fun close(skipPackageManager: Boolean): KotlinRootNpmResolution { + internal fun close(forceUpToDate: Boolean): KotlinRootNpmResolution { check(!closed) closed = true @@ -73,8 +73,6 @@ internal class KotlinRootNpmResolver internal constructor( gradleNodeModules.close() - fun result() = KotlinRootNpmResolution(rootProject, projectResolutions) - // 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) @@ -82,22 +80,19 @@ internal class KotlinRootNpmResolver internal constructor( val upToDateChecks = allNpmPackages.map { PackageJsonUpToDateCheck(it.npmProject) } - if (upToDateChecks.all { it.upToDate }) return result() + val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate } - if (skipPackageManager) { - upToDateChecks.forEach { it.commit() } - return result() - } else { - if (allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() }) { - nodeJs.packageManager.resolveRootProject(rootProject, allNpmPackages) - } else if (projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks }) { + if (allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() }) { + nodeJs.packageManager.resolveRootProject(rootProject, allNpmPackages, upToDate) + } else if (projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks }) { + if (!upToDate) { NpmSimpleLinker(nodeJs).link(allNpmPackages) } - - upToDateChecks.forEach { it.commit() } - - return result() } + + upToDateChecks.forEach { it.commit() } + + return KotlinRootNpmResolution(rootProject, projectResolutions) } private fun removeOutdatedPackages(nodeJs: NodeJsRootExtension, allNpmPackages: List) { 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 bca3fe3cd14..e71c1cd7224 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 @@ -20,6 +20,9 @@ object Yarn : NpmApi { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject) - override fun resolveRootProject(rootProject: Project, subProjects: Collection) = - getDelegate(rootProject.project).resolveRootProject(rootProject, subProjects) + override fun resolveRootProject( + rootProject: Project, + subProjects: Collection, + skipExecution: Boolean + ) = getDelegate(rootProject.project).resolveRootProject(rootProject, subProjects, skipExecution) } \ 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 51d1559790e..b0343159c4d 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 @@ -22,5 +22,9 @@ object YarnSimple : YarnBasics() { } } - override fun resolveRootProject(rootProject: Project, subProjects: Collection) = Unit + override fun resolveRootProject( + rootProject: Project, + subProjects: Collection, + skipExecution: Boolean + ) = 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 edea2e9b098..3f05bcfd774 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 @@ -14,21 +14,28 @@ import java.io.File object YarnWorkspaces : YarnBasics() { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = Unit - override fun resolveRootProject(rootProject: Project, subProjects: Collection) { + override fun resolveRootProject( + rootProject: Project, + subProjects: Collection, + skipExecution: Boolean + ) { check(rootProject == rootProject.rootProject) - setup(rootProject) - return resolveWorkspaces(rootProject, subProjects) + if (!skipExecution) setup(rootProject) + return resolveWorkspaces(rootProject, subProjects, skipExecution) } private fun resolveWorkspaces( rootProject: Project, - npmProjects: Collection + npmProjects: Collection, + skipExecution: Boolean ) { val nodeJsWorldDir = NodeJsRootPlugin.apply(rootProject).rootPackageDir - saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir) + if (!skipExecution) { + saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir) + yarnExec(rootProject, nodeJsWorldDir, NpmApi.resolveOperationDescription("yarn")) + } - yarnExec(rootProject, nodeJsWorldDir, NpmApi.resolveOperationDescription("yarn")) yarnLockReadTransitiveDependencies(nodeJsWorldDir, npmProjects.flatMap { it.externalNpmDependencies }) }