From 5569c37ee392c18dffc8aec4ffaf9cfd563ccdec Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 25 Jan 2023 15:42:38 +0100 Subject: [PATCH] [Gradle, JS] Fix npm resolution manager declaring --- .../targets/js/nodejs/NodeJsRootPlugin.kt | 65 +++++++++---------- .../js/npm/KotlinNpmResolutionManager.kt | 58 ----------------- .../gradle/targets/js/yarn/YarnPlugin.kt | 10 +-- 3 files changed, 31 insertions(+), 102 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index 90c916dbe5d..78be25d99f3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -89,8 +89,6 @@ open class NodeJsRootPlugin : Plugin { project.registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME) - YarnPlugin.apply(project) - nodeJs.resolver = KotlinRootNpmResolver( project.name, project.version.toString(), @@ -102,19 +100,27 @@ open class NodeJsRootPlugin : Plugin { val objectFactory = project.objects - val npmResolutionManager = KotlinNpmResolutionManager.registerIfAbsent( - project, - objectFactory.providerWithLazyConvention { - nodeJs.resolver.close() - }, - objectFactory.providerWithLazyConvention { - nodeJs.resolver.compilations.associate { compilation -> - "${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers + val npmResolutionManager = project.gradle.sharedServices.registerIfAbsent( + KotlinNpmResolutionManager::class.java.name, + KotlinNpmResolutionManager::class.java + ) { + it.parameters.resolution.set( + objectFactory.providerWithLazyConvention { + nodeJs.resolver.close() } - }, - gradleNodeModulesProvider, - compositeNodeModulesProvider - ) + ) + it.parameters.packageJsonHandlers.set( + objectFactory.providerWithLazyConvention { + nodeJs.resolver.compilations.associate { compilation -> + "${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers + } + } + ) + it.parameters.gradleNodeModulesProvider.set(gradleNodeModulesProvider) + it.parameters.compositeNodeModulesProvider.set(compositeNodeModulesProvider) + } + + YarnPlugin.apply(project) npmInstall.configure { it.npmResolutionManager.set(npmResolutionManager) @@ -140,27 +146,16 @@ open class NodeJsRootPlugin : Plugin { val Project.kotlinNodeJsExtension: NodeJsRootExtension get() = extensions.getByName(NodeJsRootExtension.EXTENSION_NAME).castIsolatedKotlinPluginClassLoaderAware() - private val Project.gradleNodeModules - get() = GradleNodeModulesCache.registerIfAbsent( - this, - null, - null - ) + val Project.kotlinNpmResolutionManager: Provider + get() { + val npmResolutionManager = project.gradle.sharedServices.registerIfAbsent( + KotlinNpmResolutionManager::class.java.name, + KotlinNpmResolutionManager::class.java + ) { + error("Must be already registered") + } - private val Project.compositeNodeModules - get() = CompositeNodeModulesCache.registerIfAbsent( - this, - null, - null - ) - - val Project.kotlinNpmResolutionManager - get() = KotlinNpmResolutionManager.registerIfAbsent( - this, - null, - null, - gradleNodeModules, - compositeNodeModules - ) + return npmResolutionManager + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index 4fa34c92a64..6c74c9c8ea6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -5,20 +5,16 @@ package org.jetbrains.kotlin.gradle.targets.js.npm -import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.logging.Logger import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters import org.gradle.api.tasks.Internal import org.gradle.internal.service.ServiceRegistry import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.Installation import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution -import org.jetbrains.kotlin.gradle.tasks.withType -import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject internal interface UsesKotlinNpmResolutionManager : Task { @get:Internal @@ -130,58 +126,4 @@ abstract class KotlinNpmResolutionManager : BuildService throw state0.wrappedException } } - - companion object { - private val serviceClass = KotlinNpmResolutionManager::class.java - private val serviceName = serviceClass.name - - private fun registerIfAbsentImpl( - project: Project, - resolution: Provider?, - packageJsonHandlers: Provider Unit>>>?, - gradleNodeModulesProvider: Provider, - compositeNodeModulesProvider: Provider - ): Provider { - project.gradle.sharedServices.registrations.findByName(serviceName)?.let { - @Suppress("UNCHECKED_CAST") - return it.service as Provider - } - - val message = { - "Build service KotlinNpmResolutionManager should be already registered" - } - - requireNotNull(resolution, message) - requireNotNull(packageJsonHandlers, message) - - return project.gradle.sharedServices.registerIfAbsent(serviceName, serviceClass) { - it.parameters.resolution.set(resolution) - it.parameters.packageJsonHandlers.set(packageJsonHandlers) - it.parameters.gradleNodeModulesProvider.set(gradleNodeModulesProvider) - it.parameters.compositeNodeModulesProvider.set(compositeNodeModulesProvider) - } - } - - fun registerIfAbsent( - project: Project, - resolution: Provider?, - packageJsonHandlers: Provider Unit>>>?, - gradleNodeModulesProvider: Provider, - compositeNodeModulesProvider: Provider - ) = registerIfAbsentImpl( - project, - resolution, - packageJsonHandlers, - gradleNodeModulesProvider, - compositeNodeModulesProvider - ).also { serviceProvider -> - SingleActionPerProject.run(project, UsesKotlinNpmResolutionManager::class.java.name) { - project.tasks.withType().configureEach { task -> - task.usesService(serviceProvider) - task.usesService(gradleNodeModulesProvider) - task.usesService(compositeNodeModulesProvider) - } - } - } - } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt index b1d3a8407b5..a86565e7a4b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.ST import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention open class YarnPlugin : Plugin { override fun apply(project: Project): Unit = project.run { @@ -49,20 +48,13 @@ open class YarnPlugin : Plugin { } } - val objectFactory = project.objects - val rootPackageJson = tasks.register(RootPackageJsonTask.NAME, RootPackageJsonTask::class.java) { task -> task.dependsOn(nodeJsTaskProviders.npmCachesSetupTaskProvider) task.group = NodeJsRootPlugin.TASKS_GROUP_NAME task.description = "Create root package.json" task.npmResolutionManager.apply { - // npmResolutionManager is initialised inside NodeJsRootPlugin after YarnPlugin applied - set( - objectFactory.providerWithLazyConvention { - project.kotlinNpmResolutionManager.get() - } - ) + set(project.kotlinNpmResolutionManager) disallowChanges() }