Gradle, js, resolver: don't skip reading lock file while skipping package manager execution

This commit is contained in:
Sergey Rostov
2019-07-07 17:28:25 +03:00
parent d1789b07ad
commit 88fa396d26
6 changed files with 37 additions and 28 deletions
@@ -9,7 +9,6 @@ import org.gradle.api.Incubating
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync 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.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution 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") error("NPM dependencies should be resolved $requireUpToDateReason")
} }
val skipPackageManager = upToDate && !forceFullResolve val forceUpToDate = upToDate && !forceFullResolve
state1.resolver.close(skipPackageManager).also { state1.resolver.close(forceUpToDate).also {
this.state = ResolutionState.Installed(it) this.state = ResolutionState.Installed(it)
} }
} }
@@ -18,7 +18,8 @@ interface NpmApi {
fun resolveRootProject( fun resolveRootProject(
rootProject: Project, rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution> subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
) )
companion object { companion object {
@@ -62,7 +62,7 @@ internal class KotlinRootNpmResolver internal constructor(
/** /**
* Don't use directly, use [NodeJsRootExtension.resolveIfNeeded] instead. * Don't use directly, use [NodeJsRootExtension.resolveIfNeeded] instead.
*/ */
internal fun close(skipPackageManager: Boolean): KotlinRootNpmResolution { internal fun close(forceUpToDate: Boolean): KotlinRootNpmResolution {
check(!closed) check(!closed)
closed = true closed = true
@@ -73,8 +73,6 @@ internal class KotlinRootNpmResolver internal constructor(
gradleNodeModules.close() gradleNodeModules.close()
fun result() = KotlinRootNpmResolution(rootProject, projectResolutions)
// we need manual up-to-date checking to avoid call package manager during // we need manual up-to-date checking to avoid call package manager during
// idea import if nothing was changed // idea import if nothing was changed
// we should call it even kotlinNpmInstall task is up-to-date (skipPackageManager is true) // 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 { val upToDateChecks = allNpmPackages.map {
PackageJsonUpToDateCheck(it.npmProject) PackageJsonUpToDateCheck(it.npmProject)
} }
if (upToDateChecks.all { it.upToDate }) return result() val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate }
if (skipPackageManager) { if (allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() }) {
upToDateChecks.forEach { it.commit() } nodeJs.packageManager.resolveRootProject(rootProject, allNpmPackages, upToDate)
return result() } else if (projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks }) {
} else { if (!upToDate) {
if (allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() }) {
nodeJs.packageManager.resolveRootProject(rootProject, allNpmPackages)
} else if (projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks }) {
NpmSimpleLinker(nodeJs).link(allNpmPackages) 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<KotlinCompilationNpmResolution>) { private fun removeOutdatedPackages(nodeJs: NodeJsRootExtension, allNpmPackages: List<KotlinCompilationNpmResolution>) {
@@ -20,6 +20,9 @@ object Yarn : NpmApi {
override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) =
getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject) getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject)
override fun resolveRootProject(rootProject: Project, subProjects: Collection<KotlinCompilationNpmResolution>) = override fun resolveRootProject(
getDelegate(rootProject.project).resolveRootProject(rootProject, subProjects) rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
) = getDelegate(rootProject.project).resolveRootProject(rootProject, subProjects, skipExecution)
} }
@@ -22,5 +22,9 @@ object YarnSimple : YarnBasics() {
} }
} }
override fun resolveRootProject(rootProject: Project, subProjects: Collection<KotlinCompilationNpmResolution>) = Unit override fun resolveRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
) = Unit
} }
@@ -14,21 +14,28 @@ import java.io.File
object YarnWorkspaces : YarnBasics() { object YarnWorkspaces : YarnBasics() {
override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = Unit override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = Unit
override fun resolveRootProject(rootProject: Project, subProjects: Collection<KotlinCompilationNpmResolution>) { override fun resolveRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
) {
check(rootProject == rootProject.rootProject) check(rootProject == rootProject.rootProject)
setup(rootProject) if (!skipExecution) setup(rootProject)
return resolveWorkspaces(rootProject, subProjects) return resolveWorkspaces(rootProject, subProjects, skipExecution)
} }
private fun resolveWorkspaces( private fun resolveWorkspaces(
rootProject: Project, rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution> npmProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
) { ) {
val nodeJsWorldDir = NodeJsRootPlugin.apply(rootProject).rootPackageDir 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 }) yarnLockReadTransitiveDependencies(nodeJsWorldDir, npmProjects.flatMap { it.externalNpmDependencies })
} }