[Gradle] Inverse K/JS build services declaration

It's done by hardcoding the task classes unlike to approach with other build services (with adding interfaces like Uses<blah-blah-service>), because the J/S services are subject to rework in a short time. This way earlier task initialization shouldn't cause problems.
#KT-56131 Fixed
This commit is contained in:
Alexander.Likhachev
2023-01-23 18:04:43 +01:00
committed by Space Team
parent 7638b95a31
commit 92d39f0b1d
6 changed files with 40 additions and 20 deletions
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.mpp
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.DisplayName
@MppGradlePluginTests
@@ -52,7 +51,6 @@ class BrokenLazyConfigurationIT : KGPBaseTest() {
@GradleTest
@DisplayName("works in MPP") // aka KT-56131
@Disabled
fun testBrokenTcaInMpp(gradleVersion: GradleVersion) {
project("new-mpp-lib-with-tests", gradleVersion) {
buildGradle.modify {
@@ -43,7 +43,6 @@ open class NodeJsRootPlugin : Plugin<Project> {
val setupFileHasherTask = registerTask<KotlinNpmCachesSetup>(KotlinNpmCachesSetup.NAME) {
it.description = "Setup file hasher for caches"
settings.npmResolutionManager.declareBuildServicesUsage(it)
}
registerTask<KotlinNpmInstallTask>(KotlinNpmInstallTask.NAME) {
@@ -51,7 +50,6 @@ open class NodeJsRootPlugin : Plugin<Project> {
it.dependsOn(setupFileHasherTask)
it.group = TASKS_GROUP_NAME
it.description = "Find, download and link NPM dependencies and projects"
settings.npmResolutionManager.declareBuildServicesUsage(it)
}
registerTask<Task>(PACKAGE_JSON_UMBRELLA_TASK_NAME)
@@ -97,6 +97,9 @@ class KotlinNpmResolutionManager(@Transient private val nodeJsSettings: NodeJsRo
.rootProject.gradle.sharedServices.registerIfAbsent(
"npm-resolution-manager-state-holder", KotlinNpmResolutionManagerStateHolder::class.java
) {
}.also {
resolver.declareBuildServiceForRootProjectJsTasks(it)
resolver.declareBuildServiceForAllProjectsJsTasks(it)
}
private val stateHolder get() = stateHolderProvider.get()
@@ -277,9 +280,4 @@ class KotlinNpmResolutionManager(@Transient private val nodeJsSettings: NodeJsRo
}
}
}
internal fun declareBuildServicesUsage(task: Task) {
task.usesService(stateHolderProvider)
resolver.declareCacheServicesUsage(task)
}
}
@@ -9,6 +9,7 @@ import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.logging.Logger
import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService
import org.gradle.internal.service.ServiceRegistry
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -20,6 +21,10 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.*
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmCachesSetup
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnv
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnResolution
@@ -81,6 +86,9 @@ class KotlinRootNpmResolver internal constructor(
.gradle.sharedServices.registerIfAbsent("gradle-node-modules", GradleNodeModulesCache::class.java) {
it.parameters.cacheDir.set(nodeJs_.nodeModulesGradleCacheDir)
it.parameters.rootProjectDir.set(rootProject_.projectDir)
}.also {
declareBuildServiceForRootProjectJsTasks(it)
declareBuildServiceForAllProjectsJsTasks(it)
}
internal val gradleNodeModules: GradleNodeModulesCache
@@ -94,17 +102,14 @@ class KotlinRootNpmResolver internal constructor(
.gradle.sharedServices.registerIfAbsent("composite-node-modules", CompositeNodeModulesCache::class.java) {
it.parameters.cacheDir.set(nodeJs_.nodeModulesGradleCacheDir)
it.parameters.rootProjectDir.set(rootProject_.projectDir)
}.also {
declareBuildServiceForRootProjectJsTasks(it)
declareBuildServiceForAllProjectsJsTasks(it)
}
internal val compositeNodeModules: CompositeNodeModulesCache
get() = compositeNodeModulesProvider.get()
internal fun declareCacheServicesUsage(task: Task) {
task.usesService(gradleNodeModulesProvider)
task.usesService(compositeNodeModulesProvider)
task.usesService(resolverStateHolder)
}
@Transient
private val projectResolvers_: MutableMap<String, KotlinProjectNpmResolver>? = mutableMapOf()
@@ -140,6 +145,9 @@ class KotlinRootNpmResolver internal constructor(
service.parameters.packageJsonHandlers.set(compilations.associate { compilation ->
"${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers
}.filter { it.value.isNotEmpty() })
}.also {
declareBuildServiceForRootProjectJsTasks(it)
declareBuildServiceForAllProjectsJsTasks(it)
}
}
@@ -185,9 +193,6 @@ class KotlinRootNpmResolver internal constructor(
synchronized(projectResolvers) {
check(state == RootResolverState.CONFIGURING) { alreadyResolvedMessage("add new project: $target") }
projectResolvers[target.path] = KotlinProjectNpmResolver(target, this)
target.tasks.withType<Kotlin2JsCompile>().configureEach { task ->
nodeJs_.npmResolutionManager.declareBuildServicesUsage(task)
}
}
}
@@ -315,6 +320,29 @@ class KotlinRootNpmResolver internal constructor(
}
}
}
internal fun declareBuildServiceForRootProjectJsTasks(serviceProvider: Provider<out BuildService<*>>) {
rootProject_.tasks.withType<RootPackageJsonTask>().configureEach {
it.usesService(serviceProvider)
}
rootProject_.tasks.withType<KotlinNpmInstallTask>().configureEach {
it.usesService(serviceProvider)
}
rootProject_.tasks.withType<KotlinNpmCachesSetup>().configureEach {
it.usesService(serviceProvider)
}
}
internal fun declareBuildServiceForAllProjectsJsTasks(serviceProvider: Provider<out BuildService<*>>) {
rootProject_.allprojects { project ->
project.tasks.withType<Kotlin2JsCompile>().configureEach {
it.usesService(serviceProvider)
}
project.tasks.withType<KotlinPackageJsonTask>().configureEach {
it.usesService(serviceProvider)
}
}
}
}
enum class RootResolverState {
@@ -121,7 +121,6 @@ abstract class KotlinPackageJsonTask : DefaultTask() {
task.dependsOn(target.project.provider { task.findDependentTasks() })
task.dependsOn(npmCachesSetupTask)
nodeJs.npmResolutionManager.declareBuildServicesUsage(task)
}
packageJsonUmbrella.configure { task ->
task.inputs.file(packageJsonTask.map { it.packageJson })
@@ -46,7 +46,6 @@ open class YarnPlugin : Plugin<Project> {
task.dependsOn(nodeJs.npmCachesSetupTaskProvider)
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
task.description = "Create root package.json"
nodeJs.npmResolutionManager.declareBuildServicesUsage(task)
}
configureRequiresNpmDependencies(project, rootPackageJson)