[Gradle, JS] Make KotlinWebpack cc-compatible

This commit is contained in:
Alexander Likhachev
2021-01-20 12:54:51 +03:00
parent 65faf20472
commit da80d53796
6 changed files with 36 additions and 28 deletions
@@ -51,8 +51,7 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat
val experimental = Experimental() val experimental = Experimental()
@Transient val taskRequirements: TasksRequirements = TasksRequirements()
val taskRequirements = TasksRequirements()
val nodeJsSetupTaskProvider: TaskProvider<out NodeJsSetupTask> val nodeJsSetupTaskProvider: TaskProvider<out NodeJsSetupTask>
get() = rootProject.tasks.withType(NodeJsSetupTask::class.java).named(NodeJsSetupTask.NAME) get() = rootProject.tasks.withType(NodeJsSetupTask::class.java).named(NodeJsSetupTask.NAME)
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.toDeclaration import org.jetbrains.kotlin.gradle.targets.js.npm.toDeclaration
class TasksRequirements { class TasksRequirements {
@Transient
private val _byTask = mutableMapOf<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>() private val _byTask = mutableMapOf<RequiresNpmDependencies, Set<RequiredKotlinJsDependency>>()
private val byCompilation = mutableMapOf<String, MutableSet<NpmDependencyDeclaration>>() private val byCompilation = mutableMapOf<String, MutableSet<NpmDependencyDeclaration>>()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.npm package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Incubating import org.gradle.api.Incubating
import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
@@ -120,8 +121,9 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension
@Incubating @Incubating
internal fun requireInstalled( internal fun requireInstalled(
services: ServiceRegistry, services: ServiceRegistry,
logger: Logger logger: Logger,
) = installIfNeeded(reason = "", services = services, logger = logger) reason: String = ""
) = installIfNeeded(reason = reason, services = services, logger = logger)
internal fun requireConfiguringState(): KotlinRootNpmResolver = internal fun requireConfiguringState(): KotlinRootNpmResolver =
(this.state as? ResolutionState.Configuring ?: error("NPM Dependencies already resolved and installed")).resolver (this.state as? ResolutionState.Configuring ?: error("NPM Dependencies already resolved and installed")).resolver
@@ -156,9 +158,6 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension
} }
} }
// internal fun requireAlreadyInstalled(project: Project, reason: String = ""): KotlinProjectNpmResolution =
// installIfNeeded(reason = reason)[project.path]
internal val packageJsonFiles: Collection<File> internal val packageJsonFiles: Collection<File>
get() = state.npmProjects.map { it.packageJsonFile } get() = state.npmProjects.map { it.packageJsonFile }
@@ -230,18 +229,18 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension
return resolvedProject.npmProjectsByNpmDependency[npmDependency] ?: error("NPM project resolved without $this") return resolvedProject.npmProjectsByNpmDependency[npmDependency] ?: error("NPM project resolved without $this")
} }
internal fun <T> checkRequiredDependencies(task: T) internal fun <T> checkRequiredDependencies(task: T, services: ServiceRegistry, logger: Logger, projectPath: String)
where T : RequiresNpmDependencies, where T : RequiresNpmDependencies,
T : Task { T : Task {
// val project = task.project val project = task.project
// val requestedTaskDependencies = requireAlreadyInstalled(project, "before $task execution").taskRequirements val requestedTaskDependencies = requireInstalled(services, logger, "before $task execution")[projectPath].taskRequirements
// val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf() val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf()
//
// task.requiredNpmDependencies.forEach { task.requiredNpmDependencies.forEach {
// check(it in targetRequired) { check(it in targetRequired) {
// "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " + "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " +
// "This may be caused by changing $task configuration after npm dependencies resolution." "This may be caused by changing $task configuration after npm dependencies resolution."
// } }
// } }
} }
} }
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
class KotlinProjectNpmResolution( class KotlinProjectNpmResolution(
val project: String, val project: String,
val npmProjects: List<KotlinCompilationNpmResolution>, val npmProjects: List<KotlinCompilationNpmResolution>,
val taskRequirements: Map<RequiresNpmDependencies, Collection<RequiredKotlinJsDependency>>? val taskRequirements: Map<RequiresNpmDependencies, Collection<RequiredKotlinJsDependency>>
) { ) {
val npmProjectsByNpmDependency: Map<NpmDependency, KotlinCompilationNpmResolution> by lazy { val npmProjectsByNpmDependency: Map<NpmDependency, KotlinCompilationNpmResolution> by lazy {
mutableMapOf<NpmDependency, KotlinCompilationNpmResolution>().also { result -> mutableMapOf<NpmDependency, KotlinCompilationNpmResolution>().also { result ->
@@ -35,6 +35,8 @@ constructor(
RequiresNpmDependencies { RequiresNpmDependencies {
private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject) private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject)
private val projectPath = project.path
@get:Internal @get:Internal
var testFramework: KotlinJsTestFramework? = null var testFramework: KotlinJsTestFramework? = null
set(value) { set(value) {
@@ -134,7 +136,7 @@ constructor(
} }
override fun executeTests() { override fun executeTests() {
nodeJs.npmResolutionManager.checkRequiredDependencies(this) nodeJs.npmResolutionManager.checkRequiredDependencies(task = this, services = services, logger = logger, projectPath = projectPath)
super.executeTests() super.executeTests()
} }
@@ -10,7 +10,6 @@ import org.gradle.api.Incubating
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFileProperty import org.gradle.api.file.RegularFileProperty
import org.gradle.api.internal.file.FileResolver import org.gradle.api.internal.file.FileResolver
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.tasks.* import org.gradle.api.tasks.*
@@ -50,6 +49,8 @@ constructor(
private val npmProject = compilation.npmProject private val npmProject = compilation.npmProject
private val projectPath = project.path
@get:Inject @get:Inject
open val fileResolver: FileResolver open val fileResolver: FileResolver
get() = injected get() = injected
@@ -106,6 +107,9 @@ constructor(
@Input @Input
var saveEvaluatedConfigFile: Boolean = true var saveEvaluatedConfigFile: Boolean = true
@Transient
private val baseConventions: BasePluginConvention? = project.convention.plugins["base"] as BasePluginConvention?
@Nested @Nested
val output: KotlinWebpackOutput = KotlinWebpackOutput( val output: KotlinWebpackOutput = KotlinWebpackOutput(
library = baseConventions?.archivesBaseName, library = baseConventions?.archivesBaseName,
@@ -118,22 +122,27 @@ constructor(
val outputPath: File val outputPath: File
get() = destinationDirectory get() = destinationDirectory
private val baseConventions: BasePluginConvention?
get() = project.convention.plugins["base"] as BasePluginConvention?
@get:Internal @get:Internal
internal var _destinationDirectory: File? = null internal var _destinationDirectory: File? = null
private val defaultDestinationDirectory by lazy {
project.buildDir.resolve(baseConventions!!.distsDirName)
}
@get:Internal @get:Internal
var destinationDirectory: File var destinationDirectory: File
get() = _destinationDirectory ?: project.buildDir.resolve(baseConventions!!.distsDirName) get() = _destinationDirectory ?: defaultDestinationDirectory
set(value) { set(value) {
_destinationDirectory = value _destinationDirectory = value
} }
private val defaultOutputFileName by lazy {
baseConventions?.archivesBaseName + ".js"
}
@get:Internal @get:Internal
var outputFileName: String by property { var outputFileName: String by property {
baseConventions?.archivesBaseName + ".js" defaultOutputFileName
} }
@get:OutputFile @get:OutputFile
@@ -250,7 +259,7 @@ constructor(
@TaskAction @TaskAction
fun doExecute() { fun doExecute() {
// nodeJs.npmResolutionManager?.checkRequiredDependencies(this) nodeJs.npmResolutionManager.checkRequiredDependencies(task = this, services = services, logger = logger, projectPath = projectPath)
val runner = createRunner() val runner = createRunner()