[Gradle, JS] Add descriptors to dependencies in configurations phase
- Add file collection dependencies to gradle node module building ^KT-42339 fixed
This commit is contained in:
+30
-1
@@ -5,10 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.targets.js.dukat
|
||||
|
||||
import org.gradle.api.artifacts.FileCollectionDependency
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
|
||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.isCompatibleArchive
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.CompilationResolverPlugin
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
||||
@@ -28,6 +31,8 @@ internal class DukatCompilationResolverPlugin(
|
||||
init {
|
||||
val dukatMode = compilation.dukatMode
|
||||
|
||||
gradleModelPostProcess(dukatMode, npmProject)
|
||||
|
||||
val integratedTask = project.registerTask<IntegratedDukatTask>(
|
||||
integratedTaskName,
|
||||
listOf(compilation)
|
||||
@@ -66,7 +71,8 @@ internal class DukatCompilationResolverPlugin(
|
||||
internalDependencies: Set<KotlinCompilationNpmResolver>,
|
||||
internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>,
|
||||
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
|
||||
externalNpmDependencies: Set<NpmDependency>
|
||||
externalNpmDependencies: Set<NpmDependency>,
|
||||
fileCollectionDependencies: Set<FileCollectionDependency>
|
||||
) {
|
||||
if (nodeJs.experimental.discoverTypes) {
|
||||
// todo: discoverTypes
|
||||
@@ -93,4 +99,27 @@ internal class DukatCompilationResolverPlugin(
|
||||
companion object {
|
||||
const val VERSION = "2"
|
||||
}
|
||||
}
|
||||
|
||||
internal fun gradleModelPostProcess(
|
||||
dukatMode: DukatMode,
|
||||
npmProject: NpmProject
|
||||
) {
|
||||
val compilation = npmProject.compilation
|
||||
val project = npmProject.project
|
||||
when (dukatMode) {
|
||||
DukatMode.SOURCE -> compilation.defaultSourceSet.kotlin.srcDir(npmProject.externalsDir)
|
||||
DukatMode.BINARY -> {
|
||||
npmProject.externalsDir
|
||||
.listFiles()
|
||||
?.filter { it.isCompatibleArchive }
|
||||
?.forEach {
|
||||
project.dependencies.add(
|
||||
compilation.compileDependencyConfigurationName,
|
||||
project.files(it)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-22
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js.dukat
|
||||
|
||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.isCompatibleArchive
|
||||
|
||||
class DukatExecutor(
|
||||
val nodeJs: NodeJsRootExtension,
|
||||
@@ -61,26 +60,6 @@ class DukatExecutor(
|
||||
|
||||
versionFile.writeText(version)
|
||||
|
||||
gradleModelPostProcess()
|
||||
}
|
||||
|
||||
private fun gradleModelPostProcess() {
|
||||
val compilation = npmProject.compilation
|
||||
val project = npmProject.project
|
||||
when (dukatMode) {
|
||||
DukatMode.SOURCE -> compilation.defaultSourceSet.kotlin.srcDir(npmProject.externalsDir)
|
||||
DukatMode.BINARY -> {
|
||||
npmProject.externalsDir
|
||||
.listFiles()
|
||||
?.filter { it.isCompatibleArchive }
|
||||
?.forEach {
|
||||
project.dependencies.add(
|
||||
compilation.compileDependencyConfigurationName,
|
||||
project.files(it)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
gradleModelPostProcess(dukatMode, npmProject)
|
||||
}
|
||||
}
|
||||
+5
-3
@@ -26,16 +26,18 @@ internal abstract class AbstractNodeModulesCache(val nodeJs: NodeJsRootExtension
|
||||
|
||||
@Synchronized
|
||||
fun get(
|
||||
dependency: ResolvedDependency,
|
||||
name: String,
|
||||
version: String,
|
||||
file: File
|
||||
): GradleNodeModule? = cache.getOrCompute(file) {
|
||||
buildImportedPackage(dependency, file)
|
||||
buildImportedPackage(name, version, file)
|
||||
}?.let {
|
||||
GradleNodeModule(it)
|
||||
}
|
||||
|
||||
abstract fun buildImportedPackage(
|
||||
dependency: ResolvedDependency,
|
||||
name: String,
|
||||
version: String,
|
||||
file: File
|
||||
): File?
|
||||
|
||||
|
||||
-1
@@ -14,7 +14,6 @@ import java.io.File
|
||||
*/
|
||||
internal class CompositeNodeModuleBuilder(
|
||||
val project: Project,
|
||||
val dependency: ResolvedDependency,
|
||||
val srcDir: File,
|
||||
val cache: CompositeNodeModulesCache
|
||||
) {
|
||||
|
||||
+3
-3
@@ -5,7 +5,6 @@
|
||||
|
||||
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
|
||||
|
||||
@@ -14,10 +13,11 @@ import java.io.File
|
||||
*/
|
||||
internal class CompositeNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) {
|
||||
override fun buildImportedPackage(
|
||||
dependency: ResolvedDependency,
|
||||
name: String,
|
||||
version: String,
|
||||
file: File
|
||||
): File? {
|
||||
val module = CompositeNodeModuleBuilder(project, dependency, file, this)
|
||||
val module = CompositeNodeModuleBuilder(project, file, this)
|
||||
return module.rebuild()
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.gradle.targets.js.npm
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.ResolvedDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.JS
|
||||
import org.jetbrains.kotlin.gradle.targets.js.JS_MAP
|
||||
import org.jetbrains.kotlin.gradle.targets.js.META_JS
|
||||
@@ -18,7 +17,8 @@ import java.io.File
|
||||
*/
|
||||
internal class GradleNodeModuleBuilder(
|
||||
val project: Project,
|
||||
val dependency: ResolvedDependency,
|
||||
val moduleName: String,
|
||||
val moduleVersion: String,
|
||||
val srcFiles: Collection<File>,
|
||||
val cache: GradleNodeModulesCache
|
||||
) {
|
||||
@@ -45,8 +45,8 @@ internal class GradleNodeModuleBuilder(
|
||||
val packageJson = fromSrcPackageJson(srcPackageJsonFile)?.apply {
|
||||
// Gson set nulls reflectively no matter on default values and non-null types
|
||||
@Suppress("USELESS_ELVIS")
|
||||
version = version ?: dependency.moduleVersion
|
||||
} ?: PackageJson(dependency.moduleName, dependency.moduleVersion)
|
||||
version = version ?: moduleVersion
|
||||
} ?: PackageJson(moduleName, moduleVersion)
|
||||
|
||||
val metaFiles = files.filter { it.name.endsWith(".$META_JS") }
|
||||
if (metaFiles.size == 1) {
|
||||
|
||||
+3
-2
@@ -14,10 +14,11 @@ import java.io.File
|
||||
*/
|
||||
internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) {
|
||||
override fun buildImportedPackage(
|
||||
dependency: ResolvedDependency,
|
||||
name: String,
|
||||
version: String,
|
||||
file: File
|
||||
): File? {
|
||||
val module = GradleNodeModuleBuilder(project, dependency, listOf(file), this)
|
||||
val module = GradleNodeModuleBuilder(project, name, version, listOf(file), this)
|
||||
module.visitArtifacts()
|
||||
return module.rebuild()
|
||||
}
|
||||
|
||||
+3
-1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.targets.js.npm.plugins
|
||||
|
||||
import org.gradle.api.artifacts.FileCollectionDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
||||
|
||||
@@ -13,6 +14,7 @@ internal interface CompilationResolverPlugin {
|
||||
internalDependencies: Set<KotlinCompilationNpmResolver>,
|
||||
internalCompositeDependencies: Set<KotlinCompilationNpmResolver.CompositeDependency>,
|
||||
externalGradleDependencies: Set<KotlinCompilationNpmResolver.ExternalGradleDependency>,
|
||||
externalNpmDependencies: Set<NpmDependency>
|
||||
externalNpmDependencies: Set<NpmDependency>,
|
||||
fileCollectionDependencies: Set<FileCollectionDependency>
|
||||
)
|
||||
}
|
||||
+36
-7
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.gradle.targets.js.npm.resolver
|
||||
|
||||
import org.gradle.api.artifacts.Configuration
|
||||
import org.gradle.api.artifacts.FileCollectionDependency
|
||||
import org.gradle.api.artifacts.ResolvedArtifact
|
||||
import org.gradle.api.artifacts.ResolvedDependency
|
||||
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
|
||||
@@ -149,6 +150,16 @@ internal class KotlinCompilationNpmResolver(
|
||||
// We don't have `kotlin-js-test-runner` in NPM yet
|
||||
all.dependencies.add(nodeJs.versions.kotlinJsTestRunner.createDependency(project))
|
||||
|
||||
npmProject.externalsDir
|
||||
.listFiles()
|
||||
?.filter { it.isCompatibleArchive }
|
||||
?.forEach {
|
||||
project.dependencies.add(
|
||||
all.name,
|
||||
project.files(it)
|
||||
)
|
||||
}
|
||||
|
||||
return all
|
||||
}
|
||||
|
||||
@@ -167,6 +178,7 @@ internal class KotlinCompilationNpmResolver(
|
||||
private val internalCompositeDependencies = mutableSetOf<CompositeDependency>()
|
||||
private val externalGradleDependencies = mutableSetOf<ExternalGradleDependency>()
|
||||
private val externalNpmDependencies = mutableSetOf<NpmDependency>()
|
||||
private val fileCollectionDependencies = mutableSetOf<FileCollectionDependency>()
|
||||
|
||||
fun visit(configuration: Configuration) {
|
||||
configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach {
|
||||
@@ -176,6 +188,7 @@ internal class KotlinCompilationNpmResolver(
|
||||
configuration.allDependencies.forEach { dependency ->
|
||||
when (dependency) {
|
||||
is NpmDependency -> externalNpmDependencies.add(dependency)
|
||||
is FileCollectionDependency -> fileCollectionDependencies.add(dependency)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,7 +214,8 @@ internal class KotlinCompilationNpmResolver(
|
||||
internalDependencies,
|
||||
internalCompositeDependencies,
|
||||
externalGradleDependencies,
|
||||
externalNpmDependencies
|
||||
externalNpmDependencies,
|
||||
fileCollectionDependencies
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -277,7 +291,8 @@ internal class KotlinCompilationNpmResolver(
|
||||
internalDependencies,
|
||||
internalCompositeDependencies,
|
||||
externalGradleDependencies,
|
||||
externalNpmDependencies
|
||||
externalNpmDependencies,
|
||||
fileCollectionDependencies
|
||||
)
|
||||
}
|
||||
|
||||
@@ -292,7 +307,10 @@ internal class KotlinCompilationNpmResolver(
|
||||
val externalGradleDependencies: Collection<File>,
|
||||
|
||||
@get:Input
|
||||
val externalDependencies: Collection<String>
|
||||
val externalDependencies: Collection<String>,
|
||||
|
||||
@get:Input
|
||||
val fileCollectionDependencies: Collection<File>
|
||||
) : Serializable
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
@@ -300,14 +318,16 @@ internal class KotlinCompilationNpmResolver(
|
||||
val internalDependencies: Collection<KotlinCompilationNpmResolver>,
|
||||
val internalCompositeDependencies: Collection<CompositeDependency>,
|
||||
val externalGradleDependencies: Collection<ExternalGradleDependency>,
|
||||
val externalNpmDependencies: Collection<NpmDependency>
|
||||
val externalNpmDependencies: Collection<NpmDependency>,
|
||||
val fileCollectionDependencies: Collection<FileCollectionDependency>
|
||||
) {
|
||||
val inputs: PackageJsonProducerInputs
|
||||
get() = PackageJsonProducerInputs(
|
||||
internalDependencies.map { it.npmProject.name },
|
||||
internalCompositeDependencies.flatMap { it.getPackages() },
|
||||
externalGradleDependencies.map { it.artifact.file },
|
||||
externalNpmDependencies.map { it.uniqueRepresentation() }
|
||||
externalNpmDependencies.map { it.uniqueRepresentation() },
|
||||
fileCollectionDependencies.map { it.files }.flatMap { it.files }
|
||||
)
|
||||
|
||||
fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution {
|
||||
@@ -316,14 +336,23 @@ internal class KotlinCompilationNpmResolver(
|
||||
?: error("Unresolved dependent npm package: ${this@KotlinCompilationNpmResolver} -> $it")
|
||||
}
|
||||
val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull {
|
||||
resolver.gradleNodeModules.get(it.dependency, it.artifact.file)
|
||||
resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file)
|
||||
} + fileCollectionDependencies.mapNotNull {
|
||||
val file = it.files.singleFile
|
||||
|
||||
resolver.gradleNodeModules.get(
|
||||
it.name,
|
||||
it.version ?: "0.0.1",
|
||||
file
|
||||
)
|
||||
}
|
||||
|
||||
val compositeDependencies = internalCompositeDependencies.flatMap { dependency ->
|
||||
dependency.getPackages()
|
||||
.map { file ->
|
||||
resolver.compositeNodeModules.get(
|
||||
dependency.dependency,
|
||||
dependency.dependency.moduleName,
|
||||
dependency.dependency.moduleVersion,
|
||||
file
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user