[Gradle, JS] Fix npm resolution manager declaring

This commit is contained in:
Ilya Goncharov
2023-01-25 15:42:38 +01:00
committed by Space Team
parent 065b00c3d7
commit 5569c37ee3
3 changed files with 31 additions and 102 deletions
@@ -89,8 +89,6 @@ open class NodeJsRootPlugin : Plugin<Project> {
project.registerTask<Task>(PACKAGE_JSON_UMBRELLA_TASK_NAME)
YarnPlugin.apply(project)
nodeJs.resolver = KotlinRootNpmResolver(
project.name,
project.version.toString(),
@@ -102,19 +100,27 @@ open class NodeJsRootPlugin : Plugin<Project> {
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<Project> {
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<KotlinNpmResolutionManager>
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
}
}
}
@@ -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<KotlinNpmResolutionMana
is ResolutionState.Error -> throw state0.wrappedException
}
}
companion object {
private val serviceClass = KotlinNpmResolutionManager::class.java
private val serviceName = serviceClass.name
private fun registerIfAbsentImpl(
project: Project,
resolution: Provider<KotlinRootNpmResolution>?,
packageJsonHandlers: Provider<Map<String, MutableList<PackageJson.() -> Unit>>>?,
gradleNodeModulesProvider: Provider<GradleNodeModulesCache>,
compositeNodeModulesProvider: Provider<CompositeNodeModulesCache>
): Provider<KotlinNpmResolutionManager> {
project.gradle.sharedServices.registrations.findByName(serviceName)?.let {
@Suppress("UNCHECKED_CAST")
return it.service as Provider<KotlinNpmResolutionManager>
}
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<KotlinRootNpmResolution>?,
packageJsonHandlers: Provider<Map<String, MutableList<PackageJson.() -> Unit>>>?,
gradleNodeModulesProvider: Provider<GradleNodeModulesCache>,
compositeNodeModulesProvider: Provider<CompositeNodeModulesCache>
) = registerIfAbsentImpl(
project,
resolution,
packageJsonHandlers,
gradleNodeModulesProvider,
compositeNodeModulesProvider
).also { serviceProvider ->
SingleActionPerProject.run(project, UsesKotlinNpmResolutionManager::class.java.name) {
project.tasks.withType<UsesKotlinNpmResolutionManager>().configureEach { task ->
task.usesService(serviceProvider)
task.usesService(gradleNodeModulesProvider)
task.usesService(compositeNodeModulesProvider)
}
}
}
}
}
@@ -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<Project> {
override fun apply(project: Project): Unit = project.run {
@@ -49,20 +48,13 @@ open class YarnPlugin : Plugin<Project> {
}
}
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()
}