[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 project: Project,
val npmProject: NpmProject, val npmProject: NpmProject,
val internalDependencies: Collection<KotlinCompilationNpmResolution>, val internalDependencies: Collection<KotlinCompilationNpmResolution>,
val internalCompositeDependencies: Collection<GradleNodeModule>,
val externalGradleDependencies: Collection<GradleNodeModule>, val externalGradleDependencies: Collection<GradleNodeModule>,
val externalNpmDependencies: Collection<NpmDependency>, val externalNpmDependencies: Collection<NpmDependency>,
val packageJson: PackageJson val packageJson: PackageJson
@@ -198,7 +198,7 @@ internal class KotlinCompilationNpmResolver(
?.forEach { dependentResolver -> ?.forEach { dependentResolver ->
internalDependencies.add(dependentResolver) internalDependencies.add(dependentResolver)
} }
} else { } else if (componentIdentifier !is ProjectComponentIdentifier) {
externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact)) externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact))
} }
@@ -253,6 +253,13 @@ internal class KotlinCompilationNpmResolver(
resolver.gradleNodeModules.get(it.dependency, it.artifact.file) 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( val packageJson = PackageJson(
npmProject.name, npmProject.name,
fixSemver(project.version.toString()) fixSemver(project.version.toString())
@@ -260,6 +267,10 @@ internal class KotlinCompilationNpmResolver(
packageJson.main = npmProject.main packageJson.main = npmProject.main
compositeDependencies.forEach {
packageJson.dependencies[it.name] = it.version
}
resolvedInternalDependencies.forEach { resolvedInternalDependencies.forEach {
packageJson.dependencies[it.packageJson.name] = it.packageJson.version packageJson.dependencies[it.packageJson.name] = it.packageJson.version
} }
@@ -297,6 +308,7 @@ internal class KotlinCompilationNpmResolver(
project, project,
npmProject, npmProject,
resolvedInternalDependencies, resolvedInternalDependencies,
compositeDependencies,
importedExternalGradleDependencies, importedExternalGradleDependencies,
externalNpmDependencies, externalNpmDependencies,
packageJson 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.dukat.DukatRootResolverPlugin
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation 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.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.GradleNodeModulesCache
import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager 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.PackageJsonUpToDateCheck
@@ -37,6 +38,7 @@ internal class KotlinRootNpmResolver internal constructor(
private var closed: Boolean = false private var closed: Boolean = false
val gradleNodeModules = GradleNodeModulesCache(nodeJs) val gradleNodeModules = GradleNodeModulesCache(nodeJs)
val compositeNodeModules = CompositeNodeModulesCache(nodeJs)
private val projectResolvers = mutableMapOf<Project, KotlinProjectNpmResolver>() private val projectResolvers = mutableMapOf<Project, KotlinProjectNpmResolver>()
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." 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.DefaultTask
import org.gradle.api.plugins.BasePlugin 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.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
@@ -26,9 +29,11 @@ open class KotlinPackageJsonTask : DefaultTask() {
private val producer: KotlinCompilationNpmResolver.PackageJsonProducer private val producer: KotlinCompilationNpmResolver.PackageJsonProducer
get() = compilationResolver.packageJsonProducer get() = compilationResolver.packageJsonProducer
private fun findDependentTasks(): Collection<KotlinPackageJsonTask> = private fun findDependentTasks(): Collection<Any> =
producer.internalDependencies.map { dependentResolver -> producer.internalDependencies.map { dependentResolver ->
dependentResolver.npmProject.packageJsonTask dependentResolver.npmProject.packageJsonTask
} + producer.internalCompositeDependencies.map { dependency ->
dependency.includedBuild.task(":packageJson")
} }
@get:Nested @get:Nested
@@ -9,8 +9,8 @@ import com.google.gson.Gson
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule 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.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.PackageJson
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File import java.io.File
class YarnImportedPackagesVersionResolver( class YarnImportedPackagesVersionResolver(
@@ -21,7 +21,7 @@ class YarnImportedPackagesVersionResolver(
private val resolvedVersion = mutableMapOf<String, String>() private val resolvedVersion = mutableMapOf<String, String>()
private val importedProjectWorkspaces = mutableListOf<String>() private val importedProjectWorkspaces = mutableListOf<String>()
private val externalModules = npmProjects.flatMapTo(mutableSetOf()) { private val externalModules = npmProjects.flatMapTo(mutableSetOf()) {
it.externalGradleDependencies it.externalGradleDependencies + it.internalCompositeDependencies
} }
fun resolveAndUpdatePackages(): MutableList<String> { fun resolveAndUpdatePackages(): MutableList<String> {