[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 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.RequiredKotlinJsDependency
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.NpmDependencyDeclaration
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.toDeclaration
class TasksRequirements { class TasksRequirements {
@Transient
private val _byTask = mutableMapOf<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>() 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>> val byTask: Map<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>
get() = _byTask get() = _byTask
fun getCompilationNpmRequirements(compilation: KotlinJsCompilation): Set<NpmDependency> = internal fun getCompilationNpmRequirements(compilationName: String): Set<NpmDependencyDeclaration> =
byCompilation[compilation] byCompilation[compilationName]
?: setOf() ?: setOf()
fun addTaskRequirements(task: RequiresNpmDependencies) { fun addTaskRequirements(task: RequiresNpmDependencies) {
@@ -32,11 +34,11 @@ class TasksRequirements {
.filterIsInstance<NpmDependency>() .filterIsInstance<NpmDependency>()
.toMutableSet() .toMutableSet()
val compilation = task.compilation val compilation = task.compilation.name
if (compilation in byCompilation) { if (compilation in byCompilation) {
byCompilation[compilation]!!.addAll(requiredNpmDependencies) byCompilation[compilation]!!.addAll(requiredNpmDependencies.map { it.toDeclaration() })
} else { } 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) Gson().fromJson(it, PackageJson::class.java)
} }
fun packageJson( internal fun packageJson(
name: String, name: String,
version: String, version: String,
main: String, main: String,
npmDependencies: Collection<NpmDependency> npmDependencies: Collection<NpmDependencyDeclaration>
): PackageJson { ): PackageJson {
val packageJson = PackageJson( val packageJson = PackageJson(
@@ -141,17 +141,17 @@ fun packageJson(
val dependencies = mutableMapOf<String, String>() val dependencies = mutableMapOf<String, String>()
npmDependencies.forEach { npmDependencies.forEach {
val module = it.key val module = it.name
dependencies[module] = chooseVersion(module, dependencies[module], it.version) dependencies[module] = chooseVersion(module, dependencies[module], it.version)
} }
npmDependencies.forEach { npmDependencies.forEach {
val dependency = dependencies.getValue(it.key) val dependency = dependencies.getValue(it.name)
when (it.scope) { when (it.scope) {
NpmDependency.Scope.NORMAL -> packageJson.dependencies[it.key] = dependency NpmDependency.Scope.NORMAL -> packageJson.dependencies[it.name] = dependency
NpmDependency.Scope.DEV -> packageJson.devDependencies[it.key] = dependency NpmDependency.Scope.DEV -> packageJson.devDependencies[it.name] = dependency
NpmDependency.Scope.OPTIONAL -> packageJson.optionalDependencies[it.key] = dependency NpmDependency.Scope.OPTIONAL -> packageJson.optionalDependencies[it.name] = dependency
NpmDependency.Scope.PEER -> packageJson.peerDependencies[it.key] = 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.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.property import org.jetbrains.kotlin.gradle.utils.property
@@ -43,19 +42,17 @@ constructor(
}.customFields }.customFields
@get:Nested @get:Nested
internal val externalDependencies: Collection<NestedNpmDependency> internal val externalDependencies: Collection<NpmDependencyDeclaration>
get() = compilationResolution.externalNpmDependencies get() = compilationResolution.externalNpmDependencies
.map { .map {
NestedNpmDependency( NpmDependencyDeclaration(
scope = it.scope, scope = it.scope,
name = it.name, 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 private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName
@get:OutputFile @get:OutputFile
@@ -101,13 +98,4 @@ constructor(
companion object { companion object {
const val NAME = "publicPackageJson" 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 package org.jetbrains.kotlin.gradle.targets.js.npm.resolved
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule import org.jetbrains.kotlin.gradle.targets.js.npm.*
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
/** /**
* Resolved [NpmProject] * Resolved [NpmProject]
@@ -22,11 +19,23 @@ class KotlinCompilationNpmResolution(
val internalDependencies: Collection<KotlinCompilationNpmResolution>, val internalDependencies: Collection<KotlinCompilationNpmResolution>,
val internalCompositeDependencies: Collection<GradleNodeModule>, val internalCompositeDependencies: Collection<GradleNodeModule>,
val externalGradleDependencies: Collection<GradleNodeModule>, val externalGradleDependencies: Collection<GradleNodeModule>,
val externalNpmDependencies: Collection<NpmDependency>, private val _externalNpmDependencies: Collection<NpmDependencyDeclaration>,
val packageJson: PackageJson val packageJson: PackageJson
) { ) {
val project val project
get() = _project!! get() = _project!!
val npmProject val npmProject
get() = _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 @Transient
val npmProject = compilation.npmProject val npmProject = compilation.npmProject
val compilationName = compilation.name
val npmName by lazy { val npmName by lazy {
npmProject.name npmProject.name
} }
@@ -80,6 +82,10 @@ internal class KotlinCompilationNpmResolver(
val nodeJs get() = resolver.nodeJs val nodeJs get() = resolver.nodeJs
val taskRequirements by lazy {
nodeJs.taskRequirements
}
val target get() = compilation.target val target get() = compilation.target
val project get() = target.project val project get() = target.project
@@ -415,10 +421,10 @@ internal class KotlinCompilationNpmResolver(
} }
.filterNotNull() .filterNotNull()
// val toolsNpmDependencies = nodeJs.taskRequirements val toolsNpmDependencies = taskRequirements
// .getCompilationNpmRequirements(compilation) .getCompilationNpmRequirements(compilationName)
val allNpmDependencies = externalNpmDependencies/* + toolsNpmDependencies*/ val allNpmDependencies = externalNpmDependencies.map { it.toDeclaration() } + toolsNpmDependencies
val packageJson = packageJson( val packageJson = packageJson(
npmName, npmName,
@@ -33,6 +33,10 @@ open class KotlinPackageJsonTask : DefaultTask() {
@Transient @Transient
private lateinit var compilation: KotlinJsCompilation private lateinit var compilation: KotlinJsCompilation
private val compilationName by lazy {
compilation.name
}
@Input @Input
val projectPath = project.path val projectPath = project.path
@@ -60,8 +64,8 @@ open class KotlinPackageJsonTask : DefaultTask() {
@get:Input @get:Input
internal val toolsNpmDependencies: List<String> by lazy { internal val toolsNpmDependencies: List<String> by lazy {
nodeJs.taskRequirements nodeJs.taskRequirements
.getCompilationNpmRequirements(compilation) .getCompilationNpmRequirements(compilationName)
.map { it.uniqueRepresentation() } .map { it.toString() }
} }
@get:Nested @get:Nested