[Gradle, JS] KotlinPackageJson configuration cache works

This commit is contained in:
Ilya Goncharov
2020-10-16 18:21:21 +03:00
committed by Alexander Likhachev
parent cd0dfd6fa9
commit b9aa577f84
7 changed files with 78 additions and 42 deletions
@@ -5,20 +5,22 @@
package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependencyDeclaration
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.toDeclaration
class TasksRequirements {
@Transient
private val _byTask = mutableMapOf<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>()
private val byCompilation = mutableMapOf<KotlinJsCompilation, MutableSet<NpmDependency>>()
private val byCompilation = mutableMapOf<String, MutableSet<NpmDependencyDeclaration>>()
val byTask: Map<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>
get() = _byTask
fun getCompilationNpmRequirements(compilation: KotlinJsCompilation): Set<NpmDependency> =
byCompilation[compilation]
internal fun getCompilationNpmRequirements(compilationName: String): Set<NpmDependencyDeclaration> =
byCompilation[compilationName]
?: setOf()
fun addTaskRequirements(task: RequiresNpmDependencies) {
@@ -32,11 +34,11 @@ class TasksRequirements {
.filterIsInstance<NpmDependency>()
.toMutableSet()
val compilation = task.compilation
val compilation = task.compilation.name
if (compilation in byCompilation) {
byCompilation[compilation]!!.addAll(requiredNpmDependencies)
byCompilation[compilation]!!.addAll(requiredNpmDependencies.map { it.toDeclaration() })
} else {
byCompilation[compilation] = requiredNpmDependencies
byCompilation[compilation] = requiredNpmDependencies.map { it.toDeclaration() }.toMutableSet()
}
}
}
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.tasks.Input
data class NpmDependencyDeclaration(
@Input
val scope: NpmDependency.Scope,
@Input
val name: String,
@Input
val version: String,
@Input
val generateExternals: Boolean
)
internal fun NpmDependency.toDeclaration(): NpmDependencyDeclaration =
NpmDependencyDeclaration(
scope = this.scope,
name = this.name,
version = this.version,
generateExternals = this.generateExternals
)
@@ -124,11 +124,11 @@ fun fromSrcPackageJson(packageJson: File?): PackageJson? =
Gson().fromJson(it, PackageJson::class.java)
}
fun packageJson(
internal fun packageJson(
name: String,
version: String,
main: String,
npmDependencies: Collection<NpmDependency>
npmDependencies: Collection<NpmDependencyDeclaration>
): PackageJson {
val packageJson = PackageJson(
@@ -141,17 +141,17 @@ fun packageJson(
val dependencies = mutableMapOf<String, String>()
npmDependencies.forEach {
val module = it.key
val module = it.name
dependencies[module] = chooseVersion(module, dependencies[module], it.version)
}
npmDependencies.forEach {
val dependency = dependencies.getValue(it.key)
val dependency = dependencies.getValue(it.name)
when (it.scope) {
NpmDependency.Scope.NORMAL -> packageJson.dependencies[it.key] = dependency
NpmDependency.Scope.DEV -> packageJson.devDependencies[it.key] = dependency
NpmDependency.Scope.OPTIONAL -> packageJson.optionalDependencies[it.key] = dependency
NpmDependency.Scope.PEER -> packageJson.peerDependencies[it.key] = dependency
NpmDependency.Scope.NORMAL -> packageJson.dependencies[it.name] = dependency
NpmDependency.Scope.DEV -> packageJson.devDependencies[it.name] = dependency
NpmDependency.Scope.OPTIONAL -> packageJson.optionalDependencies[it.name] = dependency
NpmDependency.Scope.PEER -> packageJson.peerDependencies[it.name] = dependency
}
}
@@ -11,7 +11,6 @@ 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.property
@@ -43,19 +42,17 @@ constructor(
}.customFields
@get:Nested
internal val externalDependencies: Collection<NestedNpmDependency>
internal val externalDependencies: Collection<NpmDependencyDeclaration>
get() = compilationResolution.externalNpmDependencies
.map {
NestedNpmDependency(
NpmDependencyDeclaration(
scope = it.scope,
name = it.name,
version = it.version
version = it.version,
generateExternals = it.generateExternals
)
}
private val realExternalDependencies: Collection<NpmDependency>
get() = compilationResolution.externalNpmDependencies
private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName
@get:OutputFile
@@ -101,13 +98,4 @@ constructor(
companion object {
const val NAME = "publicPackageJson"
}
}
internal data class NestedNpmDependency(
@Input
val scope: NpmDependency.Scope,
@Input
val name: String,
@Input
val version: String
)
}
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.npm.resolved
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
import org.jetbrains.kotlin.gradle.targets.js.npm.*
/**
* Resolved [NpmProject]
@@ -22,11 +19,23 @@ class KotlinCompilationNpmResolution(
val internalDependencies: Collection<KotlinCompilationNpmResolution>,
val internalCompositeDependencies: Collection<GradleNodeModule>,
val externalGradleDependencies: Collection<GradleNodeModule>,
val externalNpmDependencies: Collection<NpmDependency>,
private val _externalNpmDependencies: Collection<NpmDependencyDeclaration>,
val packageJson: PackageJson
) {
val project
get() = _project!!
val npmProject
get() = _npmProject!!
val externalNpmDependencies
get() = _externalNpmDependencies
.map {
NpmDependency(
project = project,
name = it.name,
version = it.version,
scope = it.scope,
generateExternals = it.generateExternals
)
}
}
@@ -62,6 +62,8 @@ internal class KotlinCompilationNpmResolver(
@Transient
val npmProject = compilation.npmProject
val compilationName = compilation.name
val npmName by lazy {
npmProject.name
}
@@ -80,6 +82,10 @@ internal class KotlinCompilationNpmResolver(
val nodeJs get() = resolver.nodeJs
val taskRequirements by lazy {
nodeJs.taskRequirements
}
val target get() = compilation.target
val project get() = target.project
@@ -415,10 +421,10 @@ internal class KotlinCompilationNpmResolver(
}
.filterNotNull()
// val toolsNpmDependencies = nodeJs.taskRequirements
// .getCompilationNpmRequirements(compilation)
val toolsNpmDependencies = taskRequirements
.getCompilationNpmRequirements(compilationName)
val allNpmDependencies = externalNpmDependencies/* + toolsNpmDependencies*/
val allNpmDependencies = externalNpmDependencies.map { it.toDeclaration() } + toolsNpmDependencies
val packageJson = packageJson(
npmName,
@@ -33,6 +33,10 @@ open class KotlinPackageJsonTask : DefaultTask() {
@Transient
private lateinit var compilation: KotlinJsCompilation
private val compilationName by lazy {
compilation.name
}
@Input
val projectPath = project.path
@@ -60,8 +64,8 @@ open class KotlinPackageJsonTask : DefaultTask() {
@get:Input
internal val toolsNpmDependencies: List<String> by lazy {
nodeJs.taskRequirements
.getCompilationNpmRequirements(compilation)
.map { it.uniqueRepresentation() }
.getCompilationNpmRequirements(compilationName)
.map { it.toString() }
}
@get:Nested