From c9ca05b4776bb0073d37722323a1572d731b4da0 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 21 Aug 2020 14:08:27 +0300 Subject: [PATCH] [Gradle, JS] Add distribute resources tasks for all binaries ^KT-41566 fixed --- .../kotlin/gradle/targets/js/ir/JsBinaries.kt | 8 ++++- .../gradle/targets/js/ir/KotlinBrowserJsIr.kt | 29 +++++++++++++++---- .../targets/js/ir/KotlinJsBinaryContainer.kt | 25 ++++++++++------ .../targets/js/ir/KotlinJsIrSubTarget.kt | 22 -------------- 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt index efe0f580b7a..026da4e3959 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt @@ -9,21 +9,27 @@ import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsBinaryContainer.Companion.generateBinaryName +import org.jetbrains.kotlin.gradle.targets.js.subtargets.BrowserDistribution import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName interface JsBinary { val compilation: KotlinJsCompilation val name: String val mode: KotlinJsBinaryMode + val distribution: Distribution } sealed class JsIrBinary( - override val compilation: KotlinJsCompilation, + final override val compilation: KotlinJsCompilation, override val name: String, override val mode: KotlinJsBinaryMode ) : JsBinary { + override val distribution: Distribution = + BrowserDistribution(compilation.target.project) + val linkTaskName: String = linkTaskName() val linkTask: TaskProvider diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index acfcfdd7ee2..dce419c80ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -7,13 +7,16 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Task import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Sync import org.gradle.api.tasks.TaskProvider import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation -import org.jetbrains.kotlin.gradle.targets.js.dsl.* +import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl 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.testing.KotlinJsTest @@ -138,7 +141,8 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : val project = compilation.target.project val nodeJs = NodeJsRootPlugin.apply(project.rootProject) - val distributeResourcesTask = configureDistributeTasks(compilation) + val processResourcesTask = target.project.tasks.named(compilation.processResourcesTaskName) + val assembleTaskProvider = project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) compilation.binaries @@ -156,10 +160,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : ) { task -> val entryFileProvider = binary.linkTask.map { it.outputFile } - task.dependsOn( - distributeResourcesTask - ) - task.description = "build webpack ${mode.name.toLowerCase()} bundle" task._destinationDirectory = distribution.directory @@ -172,6 +172,16 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : ) } + val distributeResourcesTask = registerSubTargetTask( + disambiguateCamelCased( + binary.name, + DISTRIBUTE_RESOURCES_TASK_NAME + ) + ) { + it.from(processResourcesTask) + it.into(binary.distribution.directory) + } + if (mode == KotlinJsBinaryMode.PRODUCTION) { assembleTaskProvider.dependsOn(webpackTask) val webpackCommonTask = registerSubTargetTask( @@ -179,6 +189,13 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : ) { it.dependsOn(webpackTask) } + + webpackTask.dependsOn( + distributeResourcesTask + ) + + assembleTaskProvider.dependsOn(distributeResourcesTask) + registerSubTargetTask(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) { it.dependsOn(webpackCommonTask) it.dependsOn(distributeResourcesTask) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt index 6cd9dc8b533..de7855b321f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.DomainObjectSet +import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation @@ -13,9 +14,11 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinTargetWithBinaries import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget +import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.DEVELOPMENT import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.PRODUCTION +import org.jetbrains.kotlin.gradle.targets.js.subtargets.BrowserDistribution import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinJsSubTarget import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject @@ -39,7 +42,7 @@ constructor( @JvmOverloads fun executable( compilation: KotlinJsCompilation = defaultCompilation - ) { + ): List { if (target is KotlinJsIrTarget) { target.whenBrowserConfigured { (this as KotlinJsIrSubTarget).produceExecutable() @@ -49,7 +52,7 @@ constructor( (this as KotlinJsIrSubTarget).produceExecutable() } - compilation.binaries.executableIrInternal(compilation) + return compilation.binaries.executableIrInternal(compilation) } if (target is KotlinJsTarget) { @@ -64,11 +67,13 @@ constructor( (this as KotlinJsSubTarget).produceExecutable() } - compilation.binaries.executableLegacyInternal(compilation) + return compilation.binaries.executableLegacyInternal(compilation) } + + throw GradleException("Target should be either KotlinJsTarget or KotlinJsIrTarget, but found $target") } - internal fun executableIrInternal(compilation: KotlinJsCompilation) = createBinaries( + internal fun executableIrInternal(compilation: KotlinJsCompilation): List = createBinaries( compilation = compilation, jsBinaryType = KotlinJsBinaryType.EXECUTABLE, create = ::Executable @@ -82,6 +87,7 @@ constructor( override val compilation: KotlinJsCompilation = compilation override val name: String = name override val mode: KotlinJsBinaryMode = type + override val distribution: Distribution = BrowserDistribution(compilation.target.project) } } ) @@ -97,8 +103,8 @@ constructor( modes: Collection = listOf(PRODUCTION, DEVELOPMENT), jsBinaryType: KotlinJsBinaryType, create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T - ) { - modes.forEach { + ) = + modes.map { createBinary( compilation, it, @@ -106,14 +112,13 @@ constructor( create ) } - } private fun createBinary( compilation: KotlinJsCompilation, mode: KotlinJsBinaryMode, jsBinaryType: KotlinJsBinaryType, create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T - ) { + ): JsBinary { val name = generateBinaryName( compilation, mode, @@ -121,7 +126,7 @@ constructor( ) if (name in binaryNames) { - return + return single { it.name == name } } binaryNames.add(name) @@ -132,6 +137,8 @@ constructor( if (this is ExtensionAware) { extensions.add(binary.name, binary) } + + return binary } companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index 4ef53a99233..b5ff5993281 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Task import org.gradle.api.plugins.ExtensionAware -import org.gradle.api.tasks.Copy import org.gradle.api.tasks.TaskProvider import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator @@ -26,7 +25,6 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.subtargets.BrowserDistribution import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest -import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.testing.internal.configureConventions import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry @@ -186,26 +184,6 @@ abstract class KotlinJsIrSubTarget( } - protected fun configureDistributeTasks(compilation: KotlinJsIrCompilation): TaskProvider { - val project = compilation.target.project - - val processResourcesTask = target.project.tasks.named(compilation.processResourcesTaskName) - - val distributeResourcesTask = registerSubTargetTask( - disambiguateCamelCased( - DISTRIBUTE_RESOURCES_TASK_NAME - ) - ) { - it.from(processResourcesTask) - it.into(distribution.directory) - } - - val assembleTaskProvider = project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) - assembleTaskProvider.dependsOn(distributeResourcesTask) - - return distributeResourcesTask - } - internal inline fun registerSubTargetTask( name: String, args: List = emptyList(),