未验证 提交 19e59fe7 编写于 作者: I Ilya Goncharov 提交者: Alexander Likhachev

[Gradle, JS] Experimenting with making everything transient in npm

上级 cc51869a
......@@ -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) {
......
......@@ -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>,
......
......@@ -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
......
......@@ -45,7 +45,6 @@ internal class KotlinProjectNpmResolver(
init {
addContainerListeners()
project.whenEvaluated {
val nodeJs = resolver.nodeJs
project.tasks.implementing(RequiresNpmDependencies::class)
......
......@@ -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()) {
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册