[Gradle, JS] up-to-date check on npm install, not on root package.json

#KT-34832 fixed
This commit is contained in:
Ilya Goncharov
2020-04-16 19:19:17 +03:00
parent 742e27d7f5
commit 2f8649a337
7 changed files with 35 additions and 47 deletions
@@ -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")
@@ -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)
}
@@ -19,9 +19,7 @@ interface NpmApi {
fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
subProjects: Collection<KotlinCompilationNpmResolution>
)
fun resolveRootProject(
@@ -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,
@@ -47,14 +47,10 @@ class Yarn : NpmApi {
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
subProjects: Collection<KotlinCompilationNpmResolution>
) = getDelegate(rootProject.project)
.prepareRootProject(
rootProject,
subProjects,
skipExecution,
cliArgs
subProjects
)
}
@@ -32,14 +32,10 @@ class YarnSimple : YarnBasics() {
npmProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
) {
TODO("Not yet implemented")
}
) = Unit
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
subProjects: Collection<KotlinCompilationNpmResolution>
) = Unit
}
@@ -17,30 +17,24 @@ class YarnWorkspaces : YarnBasics() {
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
subProjects: Collection<KotlinCompilationNpmResolution>
) {
check(rootProject == rootProject.rootProject)
if (!skipExecution) setup(rootProject)
setup(rootProject)
return prepareRootPackageJson(
rootProject,
subProjects,
skipExecution
subProjects
)
}
private fun prepareRootPackageJson(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean
npmProjects: Collection<KotlinCompilationNpmResolution>
) {
val nodeJs = NodeJsRootPlugin.apply(rootProject)
val rootPackageJsonFile = nodeJs.rootPackageJson
if (!skipExecution) {
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile)
}
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile)
}
override fun resolveRootProject(