[Gradle, JS] Experimenting with making everything transient in npm
This commit is contained in:
committed by
Alexander Likhachev
parent
cc51869a2a
commit
19e59fe770
+5
-1
@@ -7,9 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
|
||||
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.Task
|
||||
import org.gradle.api.plugins.BasePlugin
|
||||
import org.jetbrains.kotlin.gradle.targets.js.MultiplePluginDeclarationDetector
|
||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Companion.EXTENSION_NAME
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
|
||||
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
|
||||
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
|
||||
@@ -34,7 +36,7 @@ open class NodeJsRootPlugin : Plugin<Project> {
|
||||
|
||||
val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME)
|
||||
|
||||
tasks.register(KotlinNpmInstallTask.NAME, KotlinNpmInstallTask::class.java) {
|
||||
registerTask<KotlinNpmInstallTask>(KotlinNpmInstallTask.NAME) {
|
||||
it.dependsOn(setupTask)
|
||||
it.group = TASKS_GROUP_NAME
|
||||
it.description = "Find, download and link NPM dependencies and projects"
|
||||
@@ -42,6 +44,8 @@ open class NodeJsRootPlugin : Plugin<Project> {
|
||||
it.mustRunAfter(rootClean)
|
||||
}
|
||||
|
||||
registerTask<Task>(PACKAGE_JSON_UMBRELLA_TASK_NAME)
|
||||
|
||||
YarnPlugin.apply(project)
|
||||
|
||||
tasks.register("node" + CleanDataTask.NAME_SUFFIX, CleanDataTask::class.java) {
|
||||
|
||||
+2
@@ -15,7 +15,9 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
|
||||
* Resolved [NpmProject]
|
||||
*/
|
||||
class KotlinCompilationNpmResolution(
|
||||
@Transient
|
||||
val project: Project,
|
||||
@Transient
|
||||
val npmProject: NpmProject,
|
||||
val internalDependencies: Collection<KotlinCompilationNpmResolution>,
|
||||
val internalCompositeDependencies: Collection<GradleNodeModule>,
|
||||
|
||||
+32
-3
@@ -43,16 +43,27 @@ import java.io.Serializable
|
||||
* See [KotlinNpmResolutionManager] for details about resolution process.
|
||||
*/
|
||||
internal class KotlinCompilationNpmResolver(
|
||||
@Transient
|
||||
val projectResolver: KotlinProjectNpmResolver,
|
||||
@Transient
|
||||
val compilation: KotlinJsCompilation
|
||||
) {
|
||||
@Transient
|
||||
val resolver = projectResolver.resolver
|
||||
|
||||
@Transient
|
||||
val npmProject = compilation.npmProject
|
||||
|
||||
val nodeJs get() = resolver.nodeJs
|
||||
|
||||
val target get() = compilation.target
|
||||
|
||||
val project get() = target.project
|
||||
|
||||
@Transient
|
||||
val packageJsonTaskHolder = KotlinPackageJsonTask.create(compilation)
|
||||
|
||||
@Transient
|
||||
val publicPackageJsonTaskHolder: TaskProvider<PublicPackageJsonTask> =
|
||||
project.registerTask<PublicPackageJsonTask>(
|
||||
npmProject.publicPackageJsonTaskName,
|
||||
@@ -71,6 +82,7 @@ internal class KotlinCompilationNpmResolver(
|
||||
}
|
||||
}
|
||||
|
||||
@Transient
|
||||
val plugins: List<CompilationResolverPlugin> = projectResolver.resolver.plugins
|
||||
.flatMap {
|
||||
if (compilation.isMain()) {
|
||||
@@ -168,6 +180,12 @@ internal class KotlinCompilationNpmResolver(
|
||||
val artifact: ResolvedArtifact
|
||||
)
|
||||
|
||||
data class FileExternalGradleDependency(
|
||||
val dependencyName: String,
|
||||
val dependencyVersion: String,
|
||||
val file: File
|
||||
)
|
||||
|
||||
data class CompositeDependency(
|
||||
val dependency: ResolvedDependency,
|
||||
val includedBuild: IncludedBuild
|
||||
@@ -317,15 +335,26 @@ internal class KotlinCompilationNpmResolver(
|
||||
inner class PackageJsonProducer(
|
||||
val internalDependencies: Collection<KotlinCompilationNpmResolver>,
|
||||
val internalCompositeDependencies: Collection<CompositeDependency>,
|
||||
@Transient
|
||||
val externalGradleDependencies: Collection<ExternalGradleDependency>,
|
||||
val externalNpmDependencies: Collection<NpmDependency>,
|
||||
val fileCollectionDependencies: Collection<FileCollectionDependency>
|
||||
) {
|
||||
val fileExternalGradleDependencies by lazy {
|
||||
externalGradleDependencies.map {
|
||||
FileExternalGradleDependency(
|
||||
it.dependency.moduleName,
|
||||
it.dependency.moduleVersion,
|
||||
it.artifact.file
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val inputs: PackageJsonProducerInputs
|
||||
get() = PackageJsonProducerInputs(
|
||||
internalDependencies.map { it.npmProject.name },
|
||||
internalCompositeDependencies.flatMap { it.getPackages() },
|
||||
externalGradleDependencies.map { it.artifact.file },
|
||||
fileExternalGradleDependencies.map { it.file },
|
||||
externalNpmDependencies.map { it.uniqueRepresentation() },
|
||||
fileCollectionDependencies.map { it.files }.flatMap { it.files }
|
||||
)
|
||||
@@ -335,8 +364,8 @@ internal class KotlinCompilationNpmResolver(
|
||||
it.getResolutionOrResolveIfForced()
|
||||
?: error("Unresolved dependent npm package: ${this@KotlinCompilationNpmResolver} -> $it")
|
||||
}
|
||||
val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull {
|
||||
resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file)
|
||||
val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull {
|
||||
resolver.gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file)
|
||||
} + fileCollectionDependencies.flatMap { dependency ->
|
||||
dependency.files
|
||||
// Gradle can hash with FileHasher only files and only existed files
|
||||
|
||||
-1
@@ -45,7 +45,6 @@ internal class KotlinProjectNpmResolver(
|
||||
init {
|
||||
addContainerListeners()
|
||||
|
||||
|
||||
project.whenEvaluated {
|
||||
val nodeJs = resolver.nodeJs
|
||||
project.tasks.implementing(RequiresNpmDependencies::class)
|
||||
|
||||
+4
-5
@@ -49,25 +49,24 @@ internal class KotlinRootNpmResolver internal constructor(
|
||||
|
||||
val gradleNodeModules = GradleNodeModulesCache(nodeJs)
|
||||
val compositeNodeModules = CompositeNodeModulesCache(nodeJs)
|
||||
val packageJsonUmbrella = rootProject.registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME, Task::class.java) {}
|
||||
val projectResolvers = mutableMapOf<Project, KotlinProjectNpmResolver>()
|
||||
val projectResolvers = mutableMapOf<String, KotlinProjectNpmResolver>()
|
||||
|
||||
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
|
||||
|
||||
@Synchronized
|
||||
fun addProject(target: Project) {
|
||||
check(state == State.CONFIGURING) { alreadyResolvedMessage("add new project: $target") }
|
||||
projectResolvers[target] = KotlinProjectNpmResolver(target, this)
|
||||
projectResolvers[target.path] = KotlinProjectNpmResolver(target, this)
|
||||
}
|
||||
|
||||
operator fun get(project: Project) = projectResolvers[project] ?: error("$project is not configured for JS usage")
|
||||
operator fun get(projectPath: String) = projectResolvers[projectPath] ?: error("$projectPath is not configured for JS usage")
|
||||
|
||||
val compilations: Collection<KotlinJsCompilation>
|
||||
get() = projectResolvers.values.flatMap { it.compilationResolvers.map { it.compilation } }
|
||||
|
||||
fun findDependentResolver(src: Project, target: Project): List<KotlinCompilationNpmResolver>? {
|
||||
// todo: proper finding using KotlinTargetComponent.findUsageContext
|
||||
val targetResolver = this[target]
|
||||
val targetResolver = this[target.path]
|
||||
val mainCompilations = targetResolver.compilationResolvers.filter { it.compilation.isMain() }
|
||||
|
||||
return if (mainCompilations.isNotEmpty()) {
|
||||
|
||||
+4
-1
@@ -33,8 +33,11 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
||||
@Transient
|
||||
private lateinit var compilation: KotlinJsCompilation
|
||||
|
||||
@Input
|
||||
val projectPath = project.path
|
||||
|
||||
private val compilationResolver
|
||||
get() = nodeJs.npmResolutionManager.resolver[project][compilation]
|
||||
get() = nodeJs.npmResolutionManager.resolver[projectPath][compilation]
|
||||
|
||||
private val producer: KotlinCompilationNpmResolver.PackageJsonProducer
|
||||
get() = compilationResolver.packageJsonProducer
|
||||
|
||||
Reference in New Issue
Block a user