[Gradle, JS] Make PublicPackageJsonTask cc-compatible

This commit is contained in:
Alexander Likhachev
2021-01-19 18:09:26 +03:00
parent 521b722c09
commit 65faf20472
5 changed files with 63 additions and 47 deletions
@@ -85,7 +85,7 @@ internal class DukatCompilationResolverPlugin(
internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>, internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>,
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>, externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
externalNpmDependencies: Set<NpmDependency>, externalNpmDependencies: Set<NpmDependency>,
fileCollectionDependencies: Set<FileCollectionDependency> fileCollectionDependencies: Set<KotlinCompilationNpmResolver.FileCollectionExternalGradleDependency>
) { ) {
if (nodeJs.experimental.discoverTypes) { if (nodeJs.experimental.discoverTypes) {
// todo: discoverTypes // todo: discoverTypes
@@ -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( fun makeNodeModule(
container: File, container: File,
packageJson: PackageJson, packageJson: PackageJson,
@@ -11,8 +11,10 @@ import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation 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.targets.js.npm.NpmProject.Companion.PACKAGE_JSON
import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild
import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.gradle.utils.property import org.jetbrains.kotlin.gradle.utils.property
import java.io.File import java.io.File
import javax.inject.Inject import javax.inject.Inject
@@ -27,29 +29,32 @@ constructor(
private val nodeJs = npmProject.nodeJs private val nodeJs = npmProject.nodeJs
private val compilationName = compilation.name 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 { init {
// TODO: temporary workaround for configuration cache enabled builds // TODO: temporary workaround for configuration cache enabled builds
// disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } // disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() }
} }
// @get:Input // TODO: is map contains only serializable values?
// val packageJsonCustomFields: Map<String, Any?> @get:Input
// get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) val packageJsonCustomFields: Map<String, Any?> by lazy {
// .apply { PackageJson(fakePackageJsonValue, fakePackageJsonValue)
// compilation.packageJsonHandlers.forEach { it() } .apply {
// }.customFields compilation.packageJsonHandlers.forEach { it() }
}.customFields
}
@get:Nested @get:Nested
internal val externalDependencies: Collection<NpmDependencyDeclaration> by lazy { internal val externalDependencies: Collection<NpmDependencyDeclaration>
compilationResolution.externalNpmDependencies get() = compilationResolution.externalNpmDependencies
.map { .map {
NpmDependencyDeclaration( NpmDependencyDeclaration(
scope = it.scope, scope = it.scope,
@@ -58,40 +63,44 @@ constructor(
generateExternals = it.generateExternals generateExternals = it.generateExternals
) )
} }
private val publicPackageJsonTaskName by lazy {
npmProject.publicPackageJsonTaskName
} }
private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName private val defaultPackageJsonFile by lazy {
@get:OutputFile
var packageJsonFile: File by property {
project.buildDir project.buildDir
.resolve("tmp") .resolve("tmp")
.resolve(publicPackageJsonTaskName) .resolve(publicPackageJsonTaskName)
.resolve(PACKAGE_JSON) .resolve(PACKAGE_JSON)
} }
@get:OutputFile
var packageJsonFile: File by property { defaultPackageJsonFile }
private val isJrIrCompilation = compilation is KotlinJsIrCompilation
private val projectVersion = project.version.toString()
@TaskAction @TaskAction
fun resolve() { fun resolve() {
// val compilation = npmProject.compilation packageJson(npmProject.name, projectVersion, npmProject.main, externalDependencies).let { packageJson ->
// packageJson.main = "${npmProject.name}.js"
// packageJson(npmProject, realExternalDependencies).let { packageJson ->
// packageJson.main = "${npmProject.name}.js" if (isJrIrCompilation) {
// packageJson.types = "${npmProject.name}.d.ts"
// if (compilation is KotlinJsIrCompilation) { }
// packageJson.types = "${npmProject.name}.d.ts"
// } packageJson.apply {
// listOf(
// packageJson.apply { dependencies,
// listOf( devDependencies,
// dependencies, peerDependencies,
// devDependencies, optionalDependencies
// peerDependencies, ).forEach { it.processDependencies() }
// optionalDependencies }
// ).forEach { it.processDependencies() }
// } packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile)
// }
// packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile)
// }
} }
private fun MutableMap<String, String>.processDependencies() { private fun MutableMap<String, String>.processDependencies() {
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.targets.js.npm.plugins 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.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
@@ -15,6 +14,6 @@ internal interface CompilationResolverPlugin {
internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>, internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>,
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>, externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
externalNpmDependencies: Set<NpmDependency>, externalNpmDependencies: Set<NpmDependency>,
fileCollectionDependencies: Set<FileCollectionDependency> fileCollectionDependencies: Set<KotlinCompilationNpmResolver.FileCollectionExternalGradleDependency>
) )
} }
@@ -11,6 +11,7 @@ import org.gradle.api.artifacts.ResolvedArtifact
import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage
import org.gradle.api.file.FileCollection
import org.gradle.api.initialization.IncludedBuild import org.gradle.api.initialization.IncludedBuild
import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier
import org.gradle.api.tasks.Input import org.gradle.api.tasks.Input
@@ -210,6 +211,11 @@ internal class KotlinCompilationNpmResolver(
val artifact: ResolvedArtifact val artifact: ResolvedArtifact
) )
data class FileCollectionExternalGradleDependency(
val fileCollection: FileCollection,
val dependencyVersion: String?
)
data class FileExternalGradleDependency( data class FileExternalGradleDependency(
val dependencyName: String, val dependencyName: String,
val dependencyVersion: String, val dependencyVersion: String,
@@ -226,7 +232,7 @@ internal class KotlinCompilationNpmResolver(
private val internalCompositeDependencies = mutableSetOf<CompositeDependency>() private val internalCompositeDependencies = mutableSetOf<CompositeDependency>()
private val externalGradleDependencies = mutableSetOf<ExternalGradleDependency>() private val externalGradleDependencies = mutableSetOf<ExternalGradleDependency>()
private val externalNpmDependencies = mutableSetOf<NpmDependency>() private val externalNpmDependencies = mutableSetOf<NpmDependency>()
private val fileCollectionDependencies = mutableSetOf<FileCollectionDependency>() private val fileCollectionDependencies = mutableSetOf<FileCollectionExternalGradleDependency>()
fun visit(configuration: Configuration) { fun visit(configuration: Configuration) {
configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach {
@@ -236,7 +242,7 @@ internal class KotlinCompilationNpmResolver(
configuration.allDependencies.forEach { dependency -> configuration.allDependencies.forEach { dependency ->
when (dependency) { when (dependency) {
is NpmDependency -> externalNpmDependencies.add(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<ExternalGradleDependency>, val externalGradleDependencies: Collection<ExternalGradleDependency>,
@Transient @Transient
val externalNpmDependencies: Collection<NpmDependency>, val externalNpmDependencies: Collection<NpmDependency>,
val fileCollectionDependencies: Collection<FileCollectionDependency> val fileCollectionDependencies: Collection<FileCollectionExternalGradleDependency>
) { ) {
val externalNpmDependencyDeclarations by lazy { val externalNpmDependencyDeclarations by lazy {
externalNpmDependencies.map { externalNpmDependencies.map {
@@ -393,7 +399,7 @@ internal class KotlinCompilationNpmResolver(
internalCompositeDependencies.flatMap { it.getPackages() }, internalCompositeDependencies.flatMap { it.getPackages() },
fileExternalGradleDependencies.map { it.file }, fileExternalGradleDependencies.map { it.file },
externalNpmDependencyDeclarations.map { it.uniqueRepresentation() }, externalNpmDependencyDeclarations.map { it.uniqueRepresentation() },
fileCollectionDependencies.map { it.files }.flatMap { it.files } fileCollectionDependencies.map{ it.fileCollection }.flatMap { it.files }
) )
fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution { fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution {
@@ -404,13 +410,13 @@ internal class KotlinCompilationNpmResolver(
val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull { val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull {
gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file) gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file)
} + fileCollectionDependencies.flatMap { dependency -> } + fileCollectionDependencies.flatMap { dependency ->
dependency.files dependency.fileCollection.files
// Gradle can hash with FileHasher only files and only existed files // Gradle can hash with FileHasher only files and only existed files
.filter { it.isFile } .filter { it.isFile }
.map { file -> .map { file ->
gradleNodeModules.get( gradleNodeModules.get(
file.name, file.name,
dependency.version ?: "0.0.1", dependency.dependencyVersion ?: "0.0.1",
file file
) )
} }