[Gradle, JS] Commonize root package json to prepared files for extensibility via other npm package managers

#KT-34832 fixed
#KT-35194 fixed
This commit is contained in:
Ilya Goncharov
2020-04-17 13:31:05 +03:00
parent 2f8649a337
commit b0efd1d7ce
10 changed files with 69 additions and 38 deletions
@@ -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")
@@ -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<Project> {
@@ -30,21 +30,16 @@ open class NodeJsRootPlugin : Plugin<Project> {
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
@@ -17,6 +17,8 @@ interface NpmApi {
fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution)
fun preparedFiles(project: Project): Collection<File>
fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
@@ -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<File>
get() = resolutionManager.packageJsonFiles
@get:InputFile
val rootPackageJson: File
get() = nodeJs.rootPackageJson
@get:InputFiles
val preparedFiles: Collection<File>
get() = nodeJs.packageManager.preparedFiles(project)
// avoid using node_modules as output directory, as it is significantly slows down build
@get:OutputFile
@@ -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() {
@@ -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<String, Any>? = null,
val contentBase: List<String>
) : Serializable
@@ -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<File> =
getDelegate(project).preparedFiles(project)
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
) = getDelegate(rootProject.project)
.prepareRootProject(
rootProject,
subProjects
)
override fun resolveRootProject(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>,
@@ -44,13 +57,4 @@ class Yarn : NpmApi {
dependency,
transitive
)
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
) = getDelegate(rootProject.project)
.prepareRootProject(
rootProject,
subProjects
)
}
@@ -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<Project> {
@@ -24,6 +27,19 @@ open class YarnPlugin : Plugin<Project> {
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"
@@ -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<File> =
emptyList()
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
) = Unit
override fun resolveRootProject(
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>,
skipExecution: Boolean,
cliArgs: List<String>
) = Unit
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
) = Unit
}
@@ -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<File> {
return listOf(
NodeJsRootPlugin.apply(project.rootProject)
.rootPackageDir
.resolve(NpmProject.PACKAGE_JSON)
)
}
override fun prepareRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>
@@ -31,8 +40,7 @@ class YarnWorkspaces : YarnBasics() {
rootProject: Project,
npmProjects: Collection<KotlinCompilationNpmResolution>
) {
val nodeJs = NodeJsRootPlugin.apply(rootProject)
val rootPackageJsonFile = nodeJs.rootPackageJson
val rootPackageJsonFile = preparedFiles(rootProject).single()
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile)
}