From 65faf2047222d2b4b26204304bea1f598e5dcc44 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Tue, 19 Jan 2021 18:09:26 +0300 Subject: [PATCH] [Gradle, JS] Make PublicPackageJsonTask cc-compatible --- .../dukat/DukatCompilationResolverPlugin.kt | 2 +- .../js/npm/AbstractNodeModulesCache.kt | 2 + .../targets/js/npm/PublicPackageJsonTask.kt | 85 ++++++++++--------- .../npm/plugins/CompilationResolverPlugin.kt | 3 +- .../resolver/KotlinCompilationNpmResolver.kt | 18 ++-- 5 files changed, 63 insertions(+), 47 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 5784a37fc39..8f00905fef7 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 @@ -85,7 +85,7 @@ internal class DukatCompilationResolverPlugin( internalCompositeDependencies: Set, externalGradleDependencies: Set, externalNpmDependencies: Set, - fileCollectionDependencies: Set + fileCollectionDependencies: Set ) { if (nodeJs.experimental.discoverTypes) { // todo: discoverTypes diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt index 712905f6a73..4639a5834ba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt @@ -53,6 +53,8 @@ internal abstract class AbstractNodeModulesCache(nodeJs: NodeJsRootExtension) : } } +// Synchronized as tasks from configuration cache run in parallel and every task has it's own modules cache +@Synchronized fun makeNodeModule( container: File, packageJson: PackageJson, 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 c9998df5026..b11fb9f8b51 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 @@ -11,8 +11,10 @@ import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild +import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject @@ -27,29 +29,32 @@ constructor( private val nodeJs = npmProject.nodeJs private val compilationName = compilation.name + private val projectPath = project.path + + private val compilationResolution + get() = nodeJs.npmResolutionManager.requireInstalled( + services, + logger + )[projectPath][compilationName] - private val compilationResolution by lazy { - nodeJs.npmResolutionManager.requireInstalled( - services, - logger - )[project.path][compilationName] - } init { // TODO: temporary workaround for configuration cache enabled builds // disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } } -// @get:Input -// val packageJsonCustomFields: Map -// get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) -// .apply { -// compilation.packageJsonHandlers.forEach { it() } -// }.customFields + // TODO: is map contains only serializable values? + @get:Input + val packageJsonCustomFields: Map by lazy { + PackageJson(fakePackageJsonValue, fakePackageJsonValue) + .apply { + compilation.packageJsonHandlers.forEach { it() } + }.customFields + } @get:Nested - internal val externalDependencies: Collection by lazy { - compilationResolution.externalNpmDependencies + internal val externalDependencies: Collection + get() = compilationResolution.externalNpmDependencies .map { NpmDependencyDeclaration( scope = it.scope, @@ -58,40 +63,44 @@ constructor( generateExternals = it.generateExternals ) } + + private val publicPackageJsonTaskName by lazy { + npmProject.publicPackageJsonTaskName } - private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName - - @get:OutputFile - var packageJsonFile: File by property { + private val defaultPackageJsonFile by lazy { project.buildDir .resolve("tmp") .resolve(publicPackageJsonTaskName) .resolve(PACKAGE_JSON) } + @get:OutputFile + var packageJsonFile: File by property { defaultPackageJsonFile } + + private val isJrIrCompilation = compilation is KotlinJsIrCompilation + private val projectVersion = project.version.toString() + @TaskAction fun resolve() { -// val compilation = npmProject.compilation -// -// packageJson(npmProject, realExternalDependencies).let { packageJson -> -// packageJson.main = "${npmProject.name}.js" -// -// if (compilation is KotlinJsIrCompilation) { -// packageJson.types = "${npmProject.name}.d.ts" -// } -// -// packageJson.apply { -// listOf( -// dependencies, -// devDependencies, -// peerDependencies, -// optionalDependencies -// ).forEach { it.processDependencies() } -// } -// -// packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile) -// } + packageJson(npmProject.name, projectVersion, npmProject.main, externalDependencies).let { packageJson -> + packageJson.main = "${npmProject.name}.js" + + if (isJrIrCompilation) { + packageJson.types = "${npmProject.name}.d.ts" + } + + packageJson.apply { + listOf( + dependencies, + devDependencies, + peerDependencies, + optionalDependencies + ).forEach { it.processDependencies() } + } + + packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile) + } } private fun MutableMap.processDependencies() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt index 00f2aafa9aa..c1ba9e0f77b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.plugins -import org.gradle.api.artifacts.FileCollectionDependency import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver @@ -15,6 +14,6 @@ internal interface CompilationResolverPlugin { internalCompositeDependencies: Set, externalGradleDependencies: Set, externalNpmDependencies: Set, - fileCollectionDependencies: Set + fileCollectionDependencies: Set ) } \ 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/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index ca01e9fd36b..c6650cd2338 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -11,6 +11,7 @@ import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.attributes.Usage +import org.gradle.api.file.FileCollection import org.gradle.api.initialization.IncludedBuild import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier import org.gradle.api.tasks.Input @@ -210,6 +211,11 @@ internal class KotlinCompilationNpmResolver( val artifact: ResolvedArtifact ) + data class FileCollectionExternalGradleDependency( + val fileCollection: FileCollection, + val dependencyVersion: String? + ) + data class FileExternalGradleDependency( val dependencyName: String, val dependencyVersion: String, @@ -226,7 +232,7 @@ internal class KotlinCompilationNpmResolver( private val internalCompositeDependencies = mutableSetOf() private val externalGradleDependencies = mutableSetOf() private val externalNpmDependencies = mutableSetOf() - private val fileCollectionDependencies = mutableSetOf() + private val fileCollectionDependencies = mutableSetOf() fun visit(configuration: Configuration) { configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { @@ -236,7 +242,7 @@ internal class KotlinCompilationNpmResolver( configuration.allDependencies.forEach { dependency -> when (dependency) { is NpmDependency -> externalNpmDependencies.add(dependency) - is FileCollectionDependency -> fileCollectionDependencies.add(dependency) + is FileCollectionDependency -> fileCollectionDependencies.add(FileCollectionExternalGradleDependency(dependency.files, dependency.version)) } } @@ -369,7 +375,7 @@ internal class KotlinCompilationNpmResolver( val externalGradleDependencies: Collection, @Transient val externalNpmDependencies: Collection, - val fileCollectionDependencies: Collection + val fileCollectionDependencies: Collection ) { val externalNpmDependencyDeclarations by lazy { externalNpmDependencies.map { @@ -393,7 +399,7 @@ internal class KotlinCompilationNpmResolver( internalCompositeDependencies.flatMap { it.getPackages() }, fileExternalGradleDependencies.map { it.file }, externalNpmDependencyDeclarations.map { it.uniqueRepresentation() }, - fileCollectionDependencies.map { it.files }.flatMap { it.files } + fileCollectionDependencies.map{ it.fileCollection }.flatMap { it.files } ) fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution { @@ -404,13 +410,13 @@ internal class KotlinCompilationNpmResolver( val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull { gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file) } + fileCollectionDependencies.flatMap { dependency -> - dependency.files + dependency.fileCollection.files // Gradle can hash with FileHasher only files and only existed files .filter { it.isFile } .map { file -> gradleNodeModules.get( file.name, - dependency.version ?: "0.0.1", + dependency.dependencyVersion ?: "0.0.1", file ) }