[Gradle, JS] up-to-date check on npm install, not on root package.json
#KT-34832 fixed
This commit is contained in:
+4
@@ -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")
|
||||
|
||||
|
||||
+19
-5
@@ -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)
|
||||
}
|
||||
|
||||
+1
-3
@@ -19,9 +19,7 @@ interface NpmApi {
|
||||
|
||||
fun prepareRootProject(
|
||||
rootProject: Project,
|
||||
subProjects: Collection<KotlinCompilationNpmResolution>,
|
||||
skipExecution: Boolean,
|
||||
cliArgs: List<String>
|
||||
subProjects: Collection<KotlinCompilationNpmResolution>
|
||||
)
|
||||
|
||||
fun resolveRootProject(
|
||||
|
||||
+2
-16
@@ -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,
|
||||
|
||||
+2
-6
@@ -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
|
||||
)
|
||||
}
|
||||
+2
-6
@@ -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
|
||||
}
|
||||
+5
-11
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user