From b0efd1d7ceeb3f505d70b118f1a6c4e883111013 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 17 Apr 2020 13:31:05 +0300 Subject: [PATCH] [Gradle, JS] Commonize root package json to prepared files for extensibility via other npm package managers #KT-34832 fixed #KT-35194 fixed --- .../targets/js/nodejs/NodeJsRootExtension.kt | 4 ---- .../targets/js/nodejs/NodeJsRootPlugin.kt | 13 ++++------- .../kotlin/gradle/targets/js/npm/NpmApi.kt | 2 ++ .../js/npm/tasks/KotlinNpmInstallTask.kt | 15 ++++++++----- .../js/npm/tasks/RootPackageJsonTask.kt | 3 ++- .../targets/js/webpack/KotlinWebpackConfig.kt | 2 +- .../kotlin/gradle/targets/js/yarn/Yarn.kt | 22 +++++++++++-------- .../gradle/targets/js/yarn/YarnPlugin.kt | 20 +++++++++++++++-- .../gradle/targets/js/yarn/YarnSimple.kt | 14 +++++++----- .../gradle/targets/js/yarn/YarnWorkspaces.kt | 12 ++++++++-- 10 files changed, 69 insertions(+), 38 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index 0d8ae5bef58..e09869d0b62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.targets.js.NpmVersions import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn @@ -63,9 +62,6 @@ open class NodeJsRootExtension(val rootProject: Project) : ConfigurationPhaseAwa val rootPackageDir: File get() = rootProject.buildDir.resolve("js") - val rootPackageJson: File - get() = rootPackageDir.resolve(NpmProject.PACKAGE_JSON) - internal val rootNodeModulesStateFile: File get() = rootPackageDir.resolve("node_modules.state") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index e394225f94a..f0486c2e596 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -10,7 +10,7 @@ import org.gradle.api.Project import org.gradle.api.plugins.BasePlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Companion.EXTENSION_NAME import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask -import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin import org.jetbrains.kotlin.gradle.tasks.CleanDataTask open class NodeJsRootPlugin : Plugin { @@ -30,21 +30,16 @@ open class NodeJsRootPlugin : Plugin { val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME) - val rootPackageJson = tasks.register(RootPackageJsonTask.NAME, RootPackageJsonTask::class.java) { - it.group = TASKS_GROUP_NAME - it.description = "Create root package.json" - - it.mustRunAfter(rootClean) - } - tasks.register(KotlinNpmInstallTask.NAME, KotlinNpmInstallTask::class.java) { - it.dependsOn(setupTask, rootPackageJson) + it.dependsOn(setupTask) it.group = TASKS_GROUP_NAME it.description = "Find, download and link NPM dependencies and projects" it.mustRunAfter(rootClean) } + YarnPlugin.apply(project) + tasks.register("node" + CleanDataTask.NAME_SUFFIX, CleanDataTask::class.java) { it.cleanableStoreProvider = provider { settings.requireConfigured().cleanableStore } it.group = TASKS_GROUP_NAME diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt index 8d751d7486c..c0ff2ab9f02 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt @@ -17,6 +17,8 @@ interface NpmApi { fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) + fun preparedFiles(project: Project): Collection + fun prepareRootProject( rootProject: Project, subProjects: Collection diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt index 35081583315..dec1a721cca 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks import org.gradle.api.DefaultTask -import org.gradle.api.tasks.* +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import java.io.File @@ -15,7 +18,9 @@ open class KotlinNpmInstallTask : DefaultTask() { check(project == project.rootProject) onlyIf { - rootPackageJson.exists() + preparedFiles.all { + it.exists() + } } } @@ -30,9 +35,9 @@ open class KotlinNpmInstallTask : DefaultTask() { val packageJsonFiles: Collection get() = resolutionManager.packageJsonFiles - @get:InputFile - val rootPackageJson: File - get() = nodeJs.rootPackageJson + @get:InputFiles + val preparedFiles: Collection + get() = nodeJs.packageManager.preparedFiles(project) // avoid using node_modules as output directory, as it is significantly slows down build @get:OutputFile diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt index b18a102ed9a..6a5a75a0159 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt @@ -9,6 +9,7 @@ import org.gradle.api.DefaultTask import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject import java.io.File open class RootPackageJsonTask : DefaultTask() { @@ -25,7 +26,7 @@ open class RootPackageJsonTask : DefaultTask() { @get:OutputFile val rootPackageJson: File - get() = nodeJs.rootPackageJson + get() = nodeJs.rootPackageDir.resolve(NpmProject.PACKAGE_JSON) @TaskAction fun resolve() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt index db0d5740b7a..c06d7742859 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpackConfig.kt @@ -93,7 +93,7 @@ data class KotlinWebpackConfig( val noInfo: Boolean = true, val open: Any = true, val overlay: Any = false, - val port: Int = 8080, + val port: Int? = null, val proxy: Map? = null, val contentBase: List ) : Serializable diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index d76911c3523..fa626ebbce6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -9,6 +9,7 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution +import java.io.File class Yarn : NpmApi { private val yarnWorkspaces = YarnWorkspaces() @@ -24,6 +25,18 @@ class Yarn : NpmApi { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject) + override fun preparedFiles(project: Project): Collection = + getDelegate(project).preparedFiles(project) + + override fun prepareRootProject( + rootProject: Project, + subProjects: Collection + ) = getDelegate(rootProject.project) + .prepareRootProject( + rootProject, + subProjects + ) + override fun resolveRootProject( rootProject: Project, npmProjects: Collection, @@ -44,13 +57,4 @@ class Yarn : NpmApi { dependency, transitive ) - - override fun prepareRootProject( - rootProject: Project, - subProjects: Collection - ) = getDelegate(rootProject.project) - .prepareRootProject( - rootProject, - subProjects - ) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt index 5dd2c919754..c480437e43a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt @@ -1,13 +1,16 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * 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.yarn import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.plugins.BasePlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask +import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask import org.jetbrains.kotlin.gradle.tasks.CleanDataTask open class YarnPlugin : Plugin { @@ -24,6 +27,19 @@ open class YarnPlugin : Plugin { it.dependsOn(nodeJs.nodeJsSetupTask) } + val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME) + + val rootPackageJson = tasks.register(RootPackageJsonTask.NAME, RootPackageJsonTask::class.java) { + it.group = NodeJsRootPlugin.TASKS_GROUP_NAME + it.description = "Create root package.json" + + it.mustRunAfter(rootClean) + } + + tasks.named(KotlinNpmInstallTask.NAME).configure { + it.dependsOn(rootPackageJson) + } + tasks.register("yarn" + CleanDataTask.NAME_SUFFIX, CleanDataTask::class.java) { it.cleanableStoreProvider = provider { yarnRootExtension.requireConfigured().cleanableStore } it.description = "Clean unused local yarn version" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt index 79d550bfd9a..5627407d3b2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt @@ -9,6 +9,7 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJsonUpToDateCheck import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution +import java.io.File class YarnSimple : YarnBasics() { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) { @@ -27,15 +28,18 @@ class YarnSimple : YarnBasics() { } } + override fun preparedFiles(project: Project): Collection = + emptyList() + + override fun prepareRootProject( + rootProject: Project, + subProjects: Collection + ) = Unit + override fun resolveRootProject( rootProject: Project, npmProjects: Collection, skipExecution: Boolean, cliArgs: List ) = Unit - - override fun prepareRootProject( - rootProject: Project, - subProjects: Collection - ) = Unit } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt index a44c435b300..4942fd048cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi +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.KotlinCompilationNpmResolution import java.io.File @@ -15,6 +16,14 @@ import java.io.File class YarnWorkspaces : YarnBasics() { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = Unit + override fun preparedFiles(project: Project): Collection { + return listOf( + NodeJsRootPlugin.apply(project.rootProject) + .rootPackageDir + .resolve(NpmProject.PACKAGE_JSON) + ) + } + override fun prepareRootProject( rootProject: Project, subProjects: Collection @@ -31,8 +40,7 @@ class YarnWorkspaces : YarnBasics() { rootProject: Project, npmProjects: Collection ) { - val nodeJs = NodeJsRootPlugin.apply(rootProject) - val rootPackageJsonFile = nodeJs.rootPackageJson + val rootPackageJsonFile = preparedFiles(rootProject).single() saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile) }