From 86573c6dd18c8e0a92de8b4a40eda2dcb8210b77 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 15 Apr 2020 17:16:34 +0300 Subject: [PATCH] [Gradle, JS] Divide creating root package and install tasks #KT-34832 fixed --- .../targets/js/nodejs/NodeJsRootExtension.kt | 9 ++++ .../targets/js/nodejs/NodeJsRootPlugin.kt | 13 ++++- .../js/npm/KotlinNpmResolutionManager.kt | 19 +++++-- .../kotlin/gradle/targets/js/npm/NpmApi.kt | 13 +++-- .../npm/resolved/KotlinRootNpmResolution.kt | 6 +-- .../js/npm/resolver/KotlinRootNpmResolver.kt | 10 ++-- .../js/npm/tasks/KotlinNpmInstallTask.kt | 21 +++++--- .../js/npm/tasks/RootPackageJsonTask.kt | 38 ++++++++++++++ .../kotlin/gradle/targets/js/yarn/Yarn.kt | 18 +++++-- .../gradle/targets/js/yarn/YarnSimple.kt | 11 ++++- .../gradle/targets/js/yarn/YarnWorkspaces.kt | 49 ++++++++++++------- 11 files changed, 159 insertions(+), 48 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt 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 d942da510a4..e6eba53ec7f 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 @@ -1,3 +1,8 @@ +/* + * 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.nodejs import org.gradle.api.Project @@ -7,6 +12,7 @@ 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.yarn.Yarn import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore @@ -53,6 +59,9 @@ 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 7f2d9b82ac5..8854c08afe6 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 @@ -1,3 +1,8 @@ +/* + * 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.nodejs import org.gradle.api.Plugin @@ -5,6 +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.tasks.CleanDataTask open class NodeJsRootPlugin : Plugin { @@ -22,8 +28,13 @@ open class NodeJsRootPlugin : Plugin { it.description = "Download and install a local node/npm version" } + val rootPackageJson = tasks.register(RootPackageJsonTask.NAME, RootPackageJsonTask::class.java) { + it.group = TASKS_GROUP_NAME + it.description = "Create root package.json" + } + tasks.register(KotlinNpmInstallTask.NAME, KotlinNpmInstallTask::class.java) { - it.dependsOn(setupTask) + it.dependsOn(setupTask, rootPackageJson) it.group = TASKS_GROUP_NAME it.description = "Find, download and link NPM dependencies and projects" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index d20d6451516..e7866189807 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -84,8 +84,19 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension ) internal sealed class ResolutionState { - class Configuring(val resolver: KotlinRootNpmResolver) : ResolutionState() - class Installed(val resolved: KotlinRootNpmResolution) : ResolutionState() + abstract val npmProjects: List + + class Configuring(val resolver: KotlinRootNpmResolver) : ResolutionState() { + override val npmProjects: List + get() = resolver.compilations.map { it.npmProject } + + } + + class Installed(val resolved: KotlinRootNpmResolution) : ResolutionState() { + override val npmProjects: List + get() = resolved.projects.values.flatMap { it.npmProjects.map { it.npmProject } } + + } } @Incubating @@ -100,7 +111,7 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension installIfNeeded(requireUpToDateReason = reason)[project] internal val packageJsonFiles: Collection - get() = (state as ResolutionState.Configuring).resolver.compilations.map { it.npmProject.packageJsonFile } + get() = state.npmProjects.map { it.packageJsonFile } /** * @param requireUpToDateReason Check that project already resolved, 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 21ee4b6bc8c..e775b01737c 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 @@ -1,6 +1,6 @@ /* - * 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.npm @@ -17,13 +17,20 @@ interface NpmApi { fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) - fun resolveRootProject( + fun prepareRootProject( rootProject: Project, subProjects: Collection, skipExecution: Boolean, cliArgs: List ) + fun resolveRootProject( + rootProject: Project, + npmProjects: Collection, + skipExecution: Boolean, + cliArgs: List + ) + fun resolveDependency( npmResolution: KotlinCompilationNpmResolution, dependency: NpmDependency, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt index ed77dbfc4a2..2c7b0fc99a9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt @@ -1,17 +1,15 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.resolved import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation -import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager class KotlinRootNpmResolution( val rootProject: Project, - private val projects: Map + val projects: Map ) { operator fun get(project: Project) = projects[project] ?: KotlinProjectNpmResolution.empty(project) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index 773c97aee28..81d0f8db8ed 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -42,7 +42,7 @@ 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) {} - private val projectResolvers = mutableMapOf() + val projectResolvers = mutableMapOf() fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." @@ -86,7 +86,7 @@ internal class KotlinRootNpmResolver internal constructor( } /** - * Don't use directly, use [NodeJsRootExtension.resolveIfNeeded] instead. + * Don't use directly, use [KotlinNpmResolutionManager.installIfNeeded] instead. */ internal fun close(forceUpToDate: Boolean): KotlinRootNpmResolution { check(!closed) @@ -108,15 +108,13 @@ internal class KotlinRootNpmResolver internal constructor( } val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate } - nodeJs.packageManager.resolveRootProject( + nodeJs.packageManager.prepareRootProject( rootProject, allNpmPackages, upToDate, nodeJs.npmInstallTask.args ) - nodeJs.rootNodeModulesStateFile.writeText(System.currentTimeMillis().toString()) - upToDateChecks.forEach { it.commit() } return KotlinRootNpmResolution(rootProject, projectResolutions) 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 7577ade120e..0d81abf88eb 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 @@ -1,15 +1,12 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.tasks import org.gradle.api.DefaultTask -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.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import java.io.File @@ -29,6 +26,10 @@ open class KotlinNpmInstallTask : DefaultTask() { val packageJsonFiles: Collection get() = resolutionManager.packageJsonFiles + @get:InputFile + val rootPackageJson: File + get() = nodeJs.rootPackageJson + // avoid using node_modules as output directory, as it is significantly slows down build @get:OutputFile val nodeModulesState: File @@ -40,7 +41,15 @@ open class KotlinNpmInstallTask : DefaultTask() { @TaskAction fun resolve() { - resolutionManager.install() + val npmResolutions = resolutionManager.requireInstalled() + .projects + .values + nodeJs.packageManager.resolveRootProject( + project, + npmResolutions.flatMap { it.npmProjects }, + false, + args + ) } companion object { 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 new file mode 100644 index 00000000000..1c8e0441dca --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt @@ -0,0 +1,38 @@ +/* + * 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.tasks + +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 java.io.File + +open class RootPackageJsonTask : DefaultTask() { + init { + check(project == project.rootProject) + + outputs.upToDateWhen { + false + } + } + + private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject) + private val resolutionManager get() = nodeJs.npmResolutionManager + + @get:OutputFile + val rootPackageJson: File + get() = nodeJs.rootPackageJson + + @TaskAction + fun resolve() { + resolutionManager.install() + } + + companion object { + const val NAME = "rootPackageJson" + } +} \ No newline at end of file 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 a7d15ff5623..fcd6d475dcf 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 @@ -1,6 +1,6 @@ /* - * 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 @@ -24,6 +24,16 @@ class Yarn : NpmApi { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject) + override fun resolveRootProject( + rootProject: Project, + npmProjects: Collection, + skipExecution: Boolean, + cliArgs: List + ) { + getDelegate(rootProject.project) + .resolveRootProject(rootProject, npmProjects, skipExecution, cliArgs) + } + override fun resolveDependency( npmResolution: KotlinCompilationNpmResolution, dependency: NpmDependency, @@ -35,13 +45,13 @@ class Yarn : NpmApi { transitive ) - override fun resolveRootProject( + override fun prepareRootProject( rootProject: Project, subProjects: Collection, skipExecution: Boolean, cliArgs: List ) = getDelegate(rootProject.project) - .resolveRootProject( + .prepareRootProject( rootProject, subProjects, skipExecution, 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 b5dc148d25c..c133fd68b09 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 @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -28,6 +28,15 @@ class YarnSimple : YarnBasics() { } override fun resolveRootProject( + rootProject: Project, + npmProjects: Collection, + skipExecution: Boolean, + cliArgs: List + ) { + TODO("Not yet implemented") + } + + override fun prepareRootProject( rootProject: Project, subProjects: Collection, skipExecution: Boolean, 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 6edf5d2b2b0..9939914a535 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 @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -8,7 +8,6 @@ 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 @@ -16,7 +15,7 @@ import java.io.File class YarnWorkspaces : YarnBasics() { override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) = Unit - override fun resolveRootProject( + override fun prepareRootProject( rootProject: Project, subProjects: Collection, skipExecution: Boolean, @@ -24,31 +23,42 @@ class YarnWorkspaces : YarnBasics() { ) { check(rootProject == rootProject.rootProject) if (!skipExecution) setup(rootProject) - return resolveWorkspaces( + return prepareRootPackageJson( rootProject, subProjects, - skipExecution, - cliArgs + skipExecution ) } - private fun resolveWorkspaces( + private fun prepareRootPackageJson( + rootProject: Project, + npmProjects: Collection, + skipExecution: Boolean + ) { + val nodeJs = NodeJsRootPlugin.apply(rootProject) + val rootPackageJsonFile = nodeJs.rootPackageJson + + if (!skipExecution) { + saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile) + } + } + + override fun resolveRootProject( rootProject: Project, npmProjects: Collection, skipExecution: Boolean, cliArgs: List ) { - val nodeJsWorldDir = NodeJsRootPlugin.apply(rootProject).rootPackageDir + val nodeJs = NodeJsRootPlugin.apply(rootProject) + val nodeJsWorldDir = nodeJs.rootPackageDir - if (!skipExecution) { - saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir) - yarnExec( - rootProject, - nodeJsWorldDir, - NpmApi.resolveOperationDescription("yarn"), - cliArgs - ) - } + yarnExec( + rootProject, + nodeJsWorldDir, + NpmApi.resolveOperationDescription("yarn"), + cliArgs + ) + nodeJs.rootNodeModulesStateFile.writeText(System.currentTimeMillis().toString()) yarnLockReadTransitiveDependencies(nodeJsWorldDir, npmProjects.flatMap { it.externalNpmDependencies }) } @@ -56,8 +66,9 @@ class YarnWorkspaces : YarnBasics() { private fun saveRootProjectWorkspacesPackageJson( rootProject: Project, npmProjects: Collection, - nodeJsWorldDir: File + rootPackageJsonFile: File ) { + val nodeJsWorldDir = rootPackageJsonFile.parentFile val rootPackageJson = PackageJson(rootProject.name, rootProject.version.toString()) rootPackageJson.private = true @@ -67,7 +78,7 @@ class YarnWorkspaces : YarnBasics() { rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces rootPackageJson.saveTo( - nodeJsWorldDir.resolve(NpmProject.PACKAGE_JSON) + rootPackageJsonFile ) } } \ No newline at end of file