From 8c79baa9985c2aa8d80c4bda3b495750c411486c Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 14 Dec 2020 15:55:26 +0300 Subject: [PATCH] [Gradle, JS] Partially rootPackageJson and kotlinNpmInstall with conf cache --- .../dukat/DukatCompilationResolverPlugin.kt | 2 +- .../gradle/targets/js/dukat/DukatTask.kt | 2 +- .../targets/js/nodejs/NodeJsRootExtension.kt | 5 ++-- .../js/npm/KotlinNpmResolutionManager.kt | 28 +++++++++---------- .../targets/js/npm/PublicPackageJsonTask.kt | 2 +- .../resolved/KotlinProjectNpmResolution.kt | 15 +++++----- .../npm/resolved/KotlinRootNpmResolution.kt | 4 +-- .../npm/resolver/KotlinProjectNpmResolver.kt | 13 +++++---- .../js/npm/resolver/KotlinRootNpmResolver.kt | 4 +-- .../js/npm/tasks/KotlinNpmInstallTask.kt | 2 +- .../js/npm/tasks/KotlinPackageJsonTask.kt | 2 +- .../js/npm/tasks/RootPackageJsonTask.kt | 2 +- 12 files changed, 42 insertions(+), 39 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt index 04f67aff4fb..bfabb774b3c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt @@ -86,7 +86,7 @@ internal class DukatCompilationResolverPlugin( packageJsonIsUpdated: Boolean, resolution: KotlinRootNpmResolution ) { - val externalNpmDependencies = resolution[project][compilation].externalNpmDependencies + val externalNpmDependencies = resolution[project.path][compilation].externalNpmDependencies val target = compilation.target val externalsOutputFormat = compilation.externalsOutputFormat diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt index 6992ac7b00d..8e8a301cce1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatTask.kt @@ -44,7 +44,7 @@ abstract class DukatTask( @get:Internal @delegate:Transient val dts by lazy { - val resolvedCompilation = nodeJs.npmResolutionManager.requireInstalled()[project][compilation] + val resolvedCompilation = nodeJs.npmResolutionManager.requireInstalled()[project.path][compilation] val dtsResolver = DtsResolver(resolvedCompilation.npmProject) dtsResolver.getAllDts( resolvedCompilation.externalNpmDependencies, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index 9add2d34d71..40d24af42df 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -63,8 +63,8 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat val packageJsonUmbrellaTaskProvider: TaskProvider get() = rootProject.tasks.named(PACKAGE_JSON_UMBRELLA_TASK_NAME) - val rootPackageJsonTaskProvider: TaskProvider - get() = rootProject.tasks.withType(RootPackageJsonTask::class.java).named(RootPackageJsonTask.NAME) + val rootPackageJsonTaskProvider: TaskProvider? + get() = rootProject?.tasks?.withType(RootPackageJsonTask::class.java)?.named(RootPackageJsonTask.NAME) val rootPackageDir: File by lazy { rootProject.buildDir.resolve("js") @@ -121,7 +121,6 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat val versions = NpmVersions() - @Transient internal val npmResolutionManager = KotlinNpmResolutionManager(this) companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index 14d3852c199..9bded47c85b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -106,7 +106,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension companion object { fun npmProjectsByProjectResolutions( - resolutions: Map + resolutions: Map ): List { return resolutions .values @@ -150,7 +150,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension } internal fun requireAlreadyInstalled(project: Project, reason: String = ""): KotlinProjectNpmResolution = - installIfNeeded(reason = reason)[project] + installIfNeeded(reason = reason)[project.path] internal val packageJsonFiles: Collection get() = state.npmProjects.map { it.packageJsonFile } @@ -178,7 +178,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension when (state1) { is ResolutionState.Prepared -> alreadyResolved(state1.preparedInstallation) is ResolutionState.Configuring -> { - val upToDate = nodeJsSettings.rootPackageJsonTaskProvider.get().state.upToDate + val upToDate = nodeJsSettings.rootPackageJsonTaskProvider?.get()?.state?.upToDate ?: true if (requireUpToDateReason != null && !upToDate) { error("NPM dependencies should be resolved $requireUpToDateReason") } @@ -196,7 +196,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension } internal fun getNpmDependencyResolvedCompilation(npmDependency: NpmDependency): KotlinCompilationNpmResolution? { - val project = npmDependency.project + val project = npmDependency.project.path val resolvedProject = if (forceFullResolve) { @@ -222,15 +222,15 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension internal fun checkRequiredDependencies(task: T) where T : RequiresNpmDependencies, T : Task { - val project = task.project - val requestedTaskDependencies = requireAlreadyInstalled(project, "before $task execution").taskRequirements - val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf() - - task.requiredNpmDependencies.forEach { - check(it in targetRequired) { - "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " + - "This may be caused by changing $task configuration after npm dependencies resolution." - } - } +// val project = task.project +// val requestedTaskDependencies = requireAlreadyInstalled(project, "before $task execution").taskRequirements +// val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf() +// +// task.requiredNpmDependencies.forEach { +// check(it in targetRequired) { +// "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " + +// "This may be caused by changing $task configuration after npm dependencies resolution." +// } +// } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt index c568f79e504..5dc14a85fdd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt @@ -27,7 +27,7 @@ constructor( private val nodeJs = npmProject.nodeJs private val compilationResolution - get() = nodeJs.npmResolutionManager.requireInstalled()[project][npmProject.compilation] + get() = nodeJs.npmResolutionManager.requireInstalled()[project.path][npmProject.compilation] init { // TODO: temporary workaround for configuration cache enabled builds diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt index 34e8d5cf99f..dd5eb518a49 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt @@ -16,11 +16,11 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies * Info about NPM projects inside particular gradle [project]. */ class KotlinProjectNpmResolution( - val project: Project, + val project: String, val npmProjects: List, - val taskRequirements: Map> + val taskRequirements: Map>? ) { - val npmProjectsByNpmDependency: Map = + val npmProjectsByNpmDependency: Map by lazy { mutableMapOf().also { result -> npmProjects.forEach { npmPackage -> npmPackage.externalNpmDependencies.forEach { npmDependency -> @@ -28,15 +28,16 @@ class KotlinProjectNpmResolution( } } } + } - val byCompilation by lazy { npmProjects.associateBy { it.npmProject.compilation } } + val byCompilation by lazy { npmProjects.associateBy { it.npmProject.compilation.name } } operator fun get(compilation: KotlinJsCompilation): KotlinCompilationNpmResolution { - check(compilation.target.project == project) - return byCompilation.getValue(compilation) + check(compilation.target.project.path == project) + return byCompilation.getValue(compilation.name) } companion object { - fun empty(project: Project) = KotlinProjectNpmResolution(project, listOf(), mapOf()) + fun empty(project: String) = KotlinProjectNpmResolution(project, listOf(), mapOf()) } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt index 32f61828d30..2bfb3e4c3d5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt @@ -9,7 +9,7 @@ import org.gradle.api.Project internal class KotlinRootNpmResolution( val rootProject: Project, - internal val projects: Map + internal val projects: Map ) { - operator fun get(project: Project) = projects[project] ?: KotlinProjectNpmResolution.empty(project) + operator fun get(project: String) = projects[project] ?: KotlinProjectNpmResolution.empty(project) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index 20dfe39366f..a71c8e7edaf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -25,16 +25,19 @@ import kotlin.reflect.KClass * See [KotlinNpmResolutionManager] for details about resolution process. */ internal class KotlinProjectNpmResolver( + @Transient val project: Project, val resolver: KotlinRootNpmResolver ) { override fun toString(): String = "ProjectNpmResolver($project)" - private val byCompilation = mutableMapOf() + private val projectPath by lazy { project.path } + + private val byCompilation = mutableMapOf() operator fun get(compilation: KotlinJsCompilation): KotlinCompilationNpmResolver { check(compilation.target.project == project) - return byCompilation[compilation] ?: error("$compilation was not registered in $this") + return byCompilation[compilation.name] ?: error("$compilation was not registered in $this") } private var closed = false @@ -103,7 +106,7 @@ internal class KotlinProjectNpmResolver( private fun addCompilation(compilation: KotlinJsCompilation) { check(!closed) { resolver.alreadyResolvedMessage("add compilation $compilation") } - byCompilation[compilation] = KotlinCompilationNpmResolver(this, compilation) + byCompilation[compilation.name] = KotlinCompilationNpmResolver(this, compilation) } fun close(): KotlinProjectNpmResolution { @@ -111,9 +114,9 @@ internal class KotlinProjectNpmResolver( closed = true return KotlinProjectNpmResolution( - project, + projectPath, byCompilation.values.mapNotNull { it.close() }, - resolver.nodeJs.taskRequirements.byTask + resolver.nodeJs.taskRequirements?.byTask ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index 7caf2838bea..df23d27cc99 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -124,8 +124,8 @@ internal class KotlinRootNpmResolver internal constructor( } } - open inner class Installation(val projectResolutions: Map) { - operator fun get(project: Project) = + open inner class Installation(val projectResolutions: Map) { + operator fun get(project: String) = projectResolutions[project] ?: KotlinProjectNpmResolution.empty(project) internal fun install( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt index e22c0632703..596b93f6eef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt @@ -30,7 +30,7 @@ open class KotlinNpmInstallTask : DefaultTask() { init { // TODO: temporary workaround for configuration cache enabled builds - disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } +// disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } } @Input diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index 02d2a638cb4..17471c9e3e3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -107,7 +107,7 @@ open class KotlinPackageJsonTask : DefaultTask() { task.inputs.file(packageJsonTask.map { it.packageJson }) } - nodeJs.rootPackageJsonTaskProvider.configure { it.mustRunAfter(packageJsonTask) } + nodeJs.rootPackageJsonTaskProvider?.configure { it.mustRunAfter(packageJsonTask) } compilation.compileKotlinTaskProvider.dependsOn(npmInstallTask) compilation.compileKotlinTaskProvider.dependsOn(packageJsonTask) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt index 4752a92f68c..233075a0e3f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt @@ -31,7 +31,7 @@ open class RootPackageJsonTask : DefaultTask() { init { // TODO: temporary workaround for configuration cache enabled builds - disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } +// disableTaskOnConfigurationCacheBuild { resolutionManager.toString() } } @get:OutputFile