[Gradle, JS] Fix NPM resolution skip condition for js compilation
#KT-48241 Fixed
This commit is contained in:
+6
-3
@@ -139,15 +139,18 @@ internal class KotlinCompilationNpmResolver(
|
|||||||
@Synchronized
|
@Synchronized
|
||||||
fun getResolutionOrResolveIfForced(): KotlinCompilationNpmResolution? {
|
fun getResolutionOrResolveIfForced(): KotlinCompilationNpmResolution? {
|
||||||
if (resolution != null) return resolution
|
if (resolution != null) return resolution
|
||||||
if (packageJsonTaskHolder == null || packageJsonTaskHolder.get().state.upToDate) return resolve(skipWriting = true)
|
if (rootResolver.mayBeUpToDateTasksRegistry.get().shouldResolveNpmDependenciesFor(npmProject.packageJsonTaskPath)) {
|
||||||
if (rootResolver.forceFullResolve && resolution == null) {
|
// when we need to resolve the compilation but the task is UP-TO-DATE, so we don't have ready resolution yet
|
||||||
|
return resolve(skipWriting = true)
|
||||||
|
}
|
||||||
|
if (rootResolver.forceFullResolve) {
|
||||||
// need to force all NPM tasks to be configured in IDEA import
|
// need to force all NPM tasks to be configured in IDEA import
|
||||||
rootResolver.gradleNodeModules.fileHasher = project.serviceOf()
|
rootResolver.gradleNodeModules.fileHasher = project.serviceOf()
|
||||||
rootResolver.compositeNodeModules.fileHasher = project.serviceOf()
|
rootResolver.compositeNodeModules.fileHasher = project.serviceOf()
|
||||||
project.tasks.implementing(RequiresNpmDependencies::class).all {}
|
project.tasks.implementing(RequiresNpmDependencies::class).all {}
|
||||||
return resolve()
|
return resolve()
|
||||||
}
|
}
|
||||||
return null
|
return null // we don't need to resolve NPM dependencies for the compilation
|
||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
|||||||
+2
@@ -133,6 +133,8 @@ internal class KotlinRootNpmResolver internal constructor(
|
|||||||
YarnPlugin.apply(rootProject)
|
YarnPlugin.apply(rootProject)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val mayBeUpToDateTasksRegistry = MayBeUpToDatePackageJsonTasksRegistry.registerIfAbsent(rootProject)
|
||||||
|
|
||||||
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
|
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
|||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.targets.js.npm.resolver
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.provider.Provider
|
||||||
|
import org.gradle.api.services.BuildService
|
||||||
|
import org.gradle.api.services.BuildServiceParameters
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
|
||||||
|
|
||||||
|
internal abstract class MayBeUpToDatePackageJsonTasksRegistry : BuildService<BuildServiceParameters.None> {
|
||||||
|
private val mayBeUpToDateTasks = mutableSetOf<String>()
|
||||||
|
|
||||||
|
fun markForNpmDependenciesResolve(task: KotlinPackageJsonTask) {
|
||||||
|
mayBeUpToDateTasks.add(task.path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun shouldResolveNpmDependenciesFor(taskPath: String) = taskPath in mayBeUpToDateTasks
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun registerIfAbsent(project: Project): Provider<MayBeUpToDatePackageJsonTasksRegistry> =
|
||||||
|
project.rootProject.gradle.sharedServices.registerIfAbsent(
|
||||||
|
MayBeUpToDatePackageJsonTasksRegistry::class.qualifiedName,
|
||||||
|
MayBeUpToDatePackageJsonTasksRegistry::class.java
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks
|
|||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.plugins.BasePlugin
|
import org.gradle.api.plugins.BasePlugin
|
||||||
|
import org.gradle.api.provider.Property
|
||||||
import org.gradle.api.tasks.*
|
import org.gradle.api.tasks.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
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
|
||||||
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
|
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.fakePackageJsonValue
|
import org.jetbrains.kotlin.gradle.targets.js.npm.fakePackageJsonValue
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.MayBeUpToDatePackageJsonTasksRegistry
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME
|
||||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||||
@@ -21,12 +23,18 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask
|
|||||||
import org.jetbrains.kotlin.gradle.utils.getValue
|
import org.jetbrains.kotlin.gradle.utils.getValue
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
open class KotlinPackageJsonTask : DefaultTask() {
|
abstract class KotlinPackageJsonTask : DefaultTask() {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
onlyIf {
|
onlyIf {
|
||||||
npmResolutionManager.isConfiguringState()
|
npmResolutionManager.isConfiguringState()
|
||||||
}
|
}
|
||||||
|
outputs.upToDateWhen {
|
||||||
|
// this way we will ensure that we need to resolve dependencies for the compilation in case of UP-TO-DATE task
|
||||||
|
// used in KotlinCompilationNpmResolver#getResolutionOrResolveIfForced
|
||||||
|
mayBeUpToDateTasksRegistry.get().markForNpmDependenciesResolve(it as KotlinPackageJsonTask)
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
@@ -37,6 +45,9 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
@Transient
|
@Transient
|
||||||
private lateinit var compilation: KotlinJsCompilation
|
private lateinit var compilation: KotlinJsCompilation
|
||||||
|
|
||||||
|
@get:Internal
|
||||||
|
internal abstract val mayBeUpToDateTasksRegistry: Property<MayBeUpToDatePackageJsonTasksRegistry>
|
||||||
|
|
||||||
private val compilationDisambiguatedName by lazy {
|
private val compilationDisambiguatedName by lazy {
|
||||||
compilation.disambiguatedName
|
compilation.disambiguatedName
|
||||||
}
|
}
|
||||||
@@ -106,6 +117,10 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
task.compilation = compilation
|
task.compilation = compilation
|
||||||
task.description = "Create package.json file for $compilation"
|
task.description = "Create package.json file for $compilation"
|
||||||
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
|
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
|
||||||
|
task.mayBeUpToDateTasksRegistry.apply {
|
||||||
|
set(MayBeUpToDatePackageJsonTasksRegistry.registerIfAbsent(project))
|
||||||
|
disallowChanges()
|
||||||
|
}
|
||||||
|
|
||||||
task.dependsOn(target.project.provider { task.findDependentTasks() })
|
task.dependsOn(target.project.provider { task.findDependentTasks() })
|
||||||
task.dependsOn(npmCachesSetupTask)
|
task.dependsOn(npmCachesSetupTask)
|
||||||
|
|||||||
Reference in New Issue
Block a user