From bcbc40889247b41ec72386bac12614c8119e8877 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 8 Oct 2019 19:49:22 +0300 Subject: [PATCH] Remove NpmSimpleLinker - Now only Yarn is responsible to link modules --- .../gradle/targets/js/npm/NpmSimpleLinker.kt | 105 ------------------ .../js/npm/resolver/KotlinRootNpmResolver.kt | 11 +- 2 files changed, 5 insertions(+), 111 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmSimpleLinker.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmSimpleLinker.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmSimpleLinker.kt deleted file mode 100644 index 50062a29c25..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmSimpleLinker.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2010-2019 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 - -import com.google.gson.stream.JsonWriter -import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension -import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution -import java.io.ByteArrayInputStream -import java.io.File -import java.io.StringWriter -import java.nio.file.Files - -/** - * Handles simple case, when there are no npm depenencies required, but some tasks steel needs - * node_modules with symlinked packages and packages_imported - */ -class NpmSimpleLinker(val nodeJs: NodeJsRootExtension) { - private val rootProject = nodeJs.rootProject - private val rootProjectNodeModules = nodeJs.rootPackageDir.resolve(NpmProject.NODE_MODULES) - - fun link(projects: Collection) { - rootProjectNodeModules.listFiles()?.forEach { - val path = it.toPath() - when { - Files.isSymbolicLink(path) -> - Files.delete(path) - else -> it.deleteRecursively() - } - - } - - rootProjectNodeModules.mkdirs() - - val fsLinker = createFSLinker() - - // packages - projects.forEach { - fsLinker.link(getNodeModulePath(it.npmProject.name), it.npmProject.dir.canonicalFile) - } - - // packages_imported - projects.flatMapTo(mutableSetOf()) { - it.externalGradleDependencies - }.forEach { - fsLinker.link(getNodeModulePath(it.name), it.path.canonicalFile) - } - - fsLinker.execute() - } - - private fun getNodeModulePath(name: String) = rootProjectNodeModules.resolve(name).canonicalFile - - interface FSLinker { - fun link(linkFile: File, target: File) - fun execute() = Unit - } - - fun createFSLinker(): FSLinker = - if (nodeJs.environment.isWindows) WindowsJunctionFsLinker(rootProject, rootProjectNodeModules, nodeJs) - else JavaFsLinker() - - class WindowsJunctionFsLinker(val project: Project, val dir: File, val nodeJs: NodeJsRootExtension) : FSLinker { - val js = StringBuilder() - - init { - js.appendln("var fs = require('fs')") - } - - fun addLink(linkFile: String, target: String) { - js.appendln("fs.symlinkSync(${jsQuotedString(target)}, ${jsQuotedString(linkFile)}, 'junction')") - } - - private fun jsQuotedString(str: String) = StringWriter().also { - JsonWriter(it).value(str) - }.toString() - - override fun link(linkFile: File, target: File) { - addLink(linkFile.absolutePath, target.absolutePath) - } - - override fun execute() { - val result = project.exec { exec -> - exec.workingDir = dir - exec.executable = nodeJs.environment.nodeExecutable - exec.standardInput = ByteArrayInputStream(js.toString().toByteArray()) - exec.standardOutput = System.`out` - exec.errorOutput = System.err - } - - if (result.exitValue != 0) { - error("Cannot create windows junctions: nodejs exited with ${result.exitValue}") - } - } - } - - class JavaFsLinker : FSLinker { - override fun link(linkFile: File, target: File) { - Files.createSymbolicLink(linkFile.toPath(), target.toPath()) - } - } -} \ 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 62d3481d77f..58027de120e 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 @@ -10,8 +10,9 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatRootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension -import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModulesCache +import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager +import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJsonUpToDateCheck import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.RootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution @@ -90,12 +91,10 @@ internal class KotlinRootNpmResolver internal constructor( } val upToDate = forceUpToDate || upToDateChecks.all { it.upToDate } - if (allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() }) { + val hasExternalNpmDependencies = allNpmPackages.any { it.externalNpmDependencies.isNotEmpty() } + val hasNodeModulesDependent = projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks } + if (hasExternalNpmDependencies || hasNodeModulesDependent) { nodeJs.packageManager.resolveRootProject(rootProject, allNpmPackages, upToDate) - } else if (projectResolvers.values.any { it.taskRequirements.hasNodeModulesDependentTasks }) { - if (!upToDate) { - NpmSimpleLinker(nodeJs).link(allNpmPackages) - } } nodeJs.rootNodeModulesStateFile.writeText(System.currentTimeMillis().toString())