[Gradle, JS] Make packageJsonHandlers compatible with configuration cache

#KT-49061 Fixed
This commit is contained in:
Alexander Likhachev
2021-10-14 19:15:28 +03:00
committed by Space
parent 6a6cc1db77
commit b4cb7f3610
3 changed files with 25 additions and 14 deletions
@@ -70,10 +70,6 @@ internal class KotlinCompilationNpmResolver(
val projectPath = project.path val projectPath = project.path
val packageJsonHandlers by lazy {
compilation.packageJsonHandlers
}
@Transient @Transient
val packageJsonTaskHolder: TaskProvider<KotlinPackageJsonTask>? = val packageJsonTaskHolder: TaskProvider<KotlinPackageJsonTask>? =
KotlinPackageJsonTask.create(compilation) KotlinPackageJsonTask.create(compilation)
@@ -478,20 +474,25 @@ internal class KotlinCompilationNpmResolver(
} else emptySet() } else emptySet()
val allNpmDependencies = externalNpmDependencies + toolsNpmDependencies + dukatIfNecessary val allNpmDependencies = externalNpmDependencies + toolsNpmDependencies + dukatIfNecessary
val packageJsonHandlers = if (compilationResolver.compilation != null) {
compilationResolver.compilation.packageJsonHandlers
} else {
compilationResolver.rootResolver.getPackageJsonHandlers(projectPath, compilationResolver.compilationDisambiguatedName)
}
val packageJson = packageJson( val packageJson = packageJson(
compilationResolver.npmProject.name, compilationResolver.npmProject.name,
compilationResolver.npmVersion, compilationResolver.npmVersion,
compilationResolver.npmProject.main, compilationResolver.npmProject.main,
allNpmDependencies, allNpmDependencies,
compilationResolver.packageJsonHandlers packageJsonHandlers
) )
compositeDependencies.forEach { compositeDependencies.forEach {
packageJson.dependencies[it.name] = it.version packageJson.dependencies[it.name] = it.version
} }
compilationResolver.packageJsonHandlers.forEach { packageJsonHandlers.forEach {
it(packageJson) it(packageJson)
} }
@@ -133,14 +133,17 @@ internal class KotlinRootNpmResolver internal constructor(
rootProject_.gradle.sharedServices.registerIfAbsent( rootProject_.gradle.sharedServices.registerIfAbsent(
KotlinRootNpmResolverStateHolder::class.qualifiedName, KotlinRootNpmResolverStateHolder::class.qualifiedName,
KotlinRootNpmResolverStateHolder::class.java KotlinRootNpmResolverStateHolder::class.java
) { ) { service ->
it.parameters.plugins.set(plugins_) service.parameters.plugins.set(plugins_)
it.parameters.projectResolvers.set(projectResolvers_) service.parameters.projectResolvers.set(projectResolvers_)
it.parameters.packageManager.set(nodeJs_.packageManager) service.parameters.packageManager.set(nodeJs_.packageManager)
it.parameters.yarnEnvironment.set(yarnEnvironment_?.get()) service.parameters.yarnEnvironment.set(yarnEnvironment_?.get())
it.parameters.npmEnvironment.set(npmEnvironment_?.get()) service.parameters.npmEnvironment.set(npmEnvironment_?.get())
it.parameters.yarnResolutions.set(yarnResolutions_?.get()) service.parameters.yarnResolutions.set(yarnResolutions_?.get())
it.parameters.taskRequirements.set(taskRequirements_) service.parameters.taskRequirements.set(taskRequirements_)
service.parameters.packageJsonHandlers.set(compilations.associate { compilation ->
"${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers
}.filter { it.value.isNotEmpty() })
} }
} }
@@ -197,6 +200,9 @@ internal class KotlinRootNpmResolver internal constructor(
val compilations: Collection<KotlinJsCompilation> val compilations: Collection<KotlinJsCompilation>
get() = projectResolvers.values.flatMap { it.compilationResolvers.map { it.compilation } } get() = projectResolvers.values.flatMap { it.compilationResolvers.map { it.compilation } }
internal fun getPackageJsonHandlers(projectPath: String, compilationDisambiguatedName: String): List<PackageJson.() -> Unit> =
resolverStateHolder.get().parameters.packageJsonHandlers.get()["$projectPath:$compilationDisambiguatedName"] ?: emptyList()
fun findDependentResolver(src: Project, target: Project): List<KotlinCompilationNpmResolver>? { fun findDependentResolver(src: Project, target: Project): List<KotlinCompilationNpmResolver>? {
// todo: proper finding using KotlinTargetComponent.findUsageContext // todo: proper finding using KotlinTargetComponent.findUsageContext
val targetResolver = this[target.path] val targetResolver = this[target.path]
@@ -13,6 +13,7 @@ import org.gradle.api.services.BuildServiceParameters
import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.RootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.RootResolverPlugin
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnv import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnv
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnResolution import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnResolution
@@ -27,6 +28,9 @@ internal abstract class KotlinRootNpmResolverStateHolder : BuildService<KotlinRo
val npmEnvironment: Property<NpmEnvironment> val npmEnvironment: Property<NpmEnvironment>
val yarnResolutions: ListProperty<YarnResolution> val yarnResolutions: ListProperty<YarnResolution>
val taskRequirements: Property<TasksRequirements> val taskRequirements: Property<TasksRequirements>
// pulled up from compilation resolver since it was failing with ClassNotFoundException on deserialization, see KT-49061
val packageJsonHandlers: MapProperty<String, List<PackageJson.() -> Unit>>
} }
var initialized = false var initialized = false