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.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)
}
}
@@ -18,7 +18,8 @@ interface NpmApi {
fun resolveRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
)
companion object {
@@ -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<KotlinCompilationNpmResolution>) {
@@ -20,6 +20,9 @@ object Yarn : NpmApi {
override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) =
getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject)
override fun resolveRootProject(rootProject: Project, subProjects: Collection<KotlinCompilationNpmResolution>) =
getDelegate(rootProject.project).resolveRootProject(rootProject, subProjects)
override fun resolveRootProject(
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() {
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)
setup(rootProject)
return resolveWorkspaces(rootProject, subProjects)
if (!skipExecution) setup(rootProject)
return resolveWorkspaces(rootProject, subProjects, skipExecution)
}
private fun resolveWorkspaces(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>
npmProjects: Collection<KotlinCompilationNpmResolution>,
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 })
}