[Gradle, JS] Make PublicPackageJsonTask cc-compatible

上级 521b722c
......@@ -85,7 +85,7 @@ internal class DukatCompilationResolverPlugin(
internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>,
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
externalNpmDependencies: Set<NpmDependency>,
fileCollectionDependencies: Set<FileCollectionDependency>
fileCollectionDependencies: Set<KotlinCompilationNpmResolver.FileCollectionExternalGradleDependency>
) {
if (nodeJs.experimental.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(
container: File,
packageJson: PackageJson,
......
......@@ -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<String, Any?>
// get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
// .apply {
// compilation.packageJsonHandlers.forEach { it() }
// }.customFields
// TODO: is map contains only serializable values?
@get:Input
val packageJsonCustomFields: Map<String, Any?> by lazy {
PackageJson(fakePackageJsonValue, fakePackageJsonValue)
.apply {
compilation.packageJsonHandlers.forEach { it() }
}.customFields
}
@get:Nested
internal val externalDependencies: Collection<NpmDependencyDeclaration> by lazy {
compilationResolution.externalNpmDependencies
internal val externalDependencies: Collection<NpmDependencyDeclaration>
get() = compilationResolution.externalNpmDependencies
.map {
NpmDependencyDeclaration(
scope = it.scope,
......@@ -58,40 +63,44 @@ constructor(
generateExternals = it.generateExternals
)
}
}
private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName
private val publicPackageJsonTaskName by lazy {
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<String, String>.processDependencies() {
......
......@@ -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<KotlinCompilationNpmResolver.CompositeDependency>,
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
externalNpmDependencies: Set<NpmDependency>,
fileCollectionDependencies: Set<FileCollectionDependency>
fileCollectionDependencies: Set<KotlinCompilationNpmResolver.FileCollectionExternalGradleDependency>
)
}
\ No newline at end of file
......@@ -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<CompositeDependency>()
private val externalGradleDependencies = mutableSetOf<ExternalGradleDependency>()
private val externalNpmDependencies = mutableSetOf<NpmDependency>()
private val fileCollectionDependencies = mutableSetOf<FileCollectionDependency>()
private val fileCollectionDependencies = mutableSetOf<FileCollectionExternalGradleDependency>()
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<ExternalGradleDependency>,
@Transient
val externalNpmDependencies: Collection<NpmDependency>,
val fileCollectionDependencies: Collection<FileCollectionDependency>
val fileCollectionDependencies: Collection<FileCollectionExternalGradleDependency>
) {
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
)
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册