[Gradle, JS] Hardcode with composite build

#KT-32466 fixed
#KT-36784 fixed
#KT-36864 fixed
This commit is contained in:
Ilya Goncharov
2020-03-25 19:38:16 +03:00
parent ae021e21db
commit 7ad489883d
7 changed files with 109 additions and 5 deletions
@@ -0,0 +1,61 @@
/*
* 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.
*/
package org.jetbrains.kotlin.gradle.targets.js.npm
import com.google.gson.GsonBuilder
import org.gradle.api.Project
import org.gradle.api.artifacts.ResolvedDependency
import java.io.File
/**
* Creates fake NodeJS module directory from given composite [dependency].
*/
internal class CompositeNodeModuleBuilder(
val project: Project,
val dependency: ResolvedDependency,
val srcDir: File,
val cache: CompositeNodeModulesCache
) {
var srcPackageJsonFile: File = srcDir
fun rebuild(): File? {
check(srcPackageJsonFile.isFile) {
"Unable to read package.json of composite build"
}
val packageJson = fromSrcPackageJson(srcPackageJsonFile)!!
packageJson.main = srcDir.parentFile.resolve(packageJson.main!!).canonicalPath
// yarn requires semver
packageJson.version = fixSemver(packageJson.version)
return makeNodeModule2(cache.dir, packageJson)
}
}
fun makeNodeModule2(
container: File,
packageJson: PackageJson
): File {
val dir = importedPackageDir(container, packageJson.name, packageJson.version)
if (dir.exists()) dir.deleteRecursively()
check(dir.mkdirs()) {
"Cannot create directory: $dir"
}
val gson = GsonBuilder()
.setPrettyPrinting()
.create()
dir.resolve("package.json").writer().use {
gson.toJson(packageJson, it)
}
return dir
}
@@ -0,0 +1,23 @@
/*
* 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.
*/
package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.artifacts.ResolvedDependency
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import java.io.File
/**
* Cache for storing already created [GradleNodeModule]s
*/
internal class CompositeNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) {
override fun buildImportedPackage(
dependency: ResolvedDependency,
file: File
): File? {
val module = CompositeNodeModuleBuilder(project, dependency, file, this)
return module.rebuild()
}
}
@@ -18,6 +18,7 @@ class KotlinCompilationNpmResolution(
val project: Project,
val npmProject: NpmProject,
val internalDependencies: Collection<KotlinCompilationNpmResolution>,
val internalCompositeDependencies: Collection<GradleNodeModule>,
val externalGradleDependencies: Collection<GradleNodeModule>,
val externalNpmDependencies: Collection<NpmDependency>,
val packageJson: PackageJson
@@ -198,7 +198,7 @@ internal class KotlinCompilationNpmResolver(
?.forEach { dependentResolver ->
internalDependencies.add(dependentResolver)
}
} else {
} else if (componentIdentifier !is ProjectComponentIdentifier) {
externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact))
}
@@ -253,6 +253,13 @@ internal class KotlinCompilationNpmResolver(
resolver.gradleNodeModules.get(it.dependency, it.artifact.file)
}
val compositeDependencies = internalCompositeDependencies.mapNotNull { dependency ->
resolver.compositeNodeModules.get(
dependency.dependency,
dependency.includedBuild.projectDir.resolve("build/js/packages/lib/package.json")
)
}
val packageJson = PackageJson(
npmProject.name,
fixSemver(project.version.toString())
@@ -260,6 +267,10 @@ internal class KotlinCompilationNpmResolver(
packageJson.main = npmProject.main
compositeDependencies.forEach {
packageJson.dependencies[it.name] = it.version
}
resolvedInternalDependencies.forEach {
packageJson.dependencies[it.packageJson.name] = it.packageJson.version
}
@@ -297,6 +308,7 @@ internal class KotlinCompilationNpmResolver(
project,
npmProject,
resolvedInternalDependencies,
compositeDependencies,
importedExternalGradleDependencies,
externalNpmDependencies,
packageJson
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatRootResolverPlugin
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.npm.CompositeNodeModulesCache
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
@@ -37,6 +38,7 @@ internal class KotlinRootNpmResolver internal constructor(
private var closed: Boolean = false
val gradleNodeModules = GradleNodeModulesCache(nodeJs)
val compositeNodeModules = CompositeNodeModulesCache(nodeJs)
private val projectResolvers = mutableMapOf<Project, KotlinProjectNpmResolver>()
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.*
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
@@ -26,9 +29,11 @@ open class KotlinPackageJsonTask : DefaultTask() {
private val producer: KotlinCompilationNpmResolver.PackageJsonProducer
get() = compilationResolver.packageJsonProducer
private fun findDependentTasks(): Collection<KotlinPackageJsonTask> =
private fun findDependentTasks(): Collection<Any> =
producer.internalDependencies.map { dependentResolver ->
dependentResolver.npmProject.packageJsonTask
} + producer.internalCompositeDependencies.map { dependency ->
dependency.includedBuild.task(":packageJson")
}
@get:Nested
@@ -9,8 +9,8 @@ import com.google.gson.Gson
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File
class YarnImportedPackagesVersionResolver(
@@ -21,7 +21,7 @@ class YarnImportedPackagesVersionResolver(
private val resolvedVersion = mutableMapOf<String, String>()
private val importedProjectWorkspaces = mutableListOf<String>()
private val externalModules = npmProjects.flatMapTo(mutableSetOf()) {
it.externalGradleDependencies
it.externalGradleDependencies + it.internalCompositeDependencies
}
fun resolveAndUpdatePackages(): MutableList<String> {