diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt index 0374f2e8790..f5b10e84496 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt @@ -8,5 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.js.dsl import java.io.File interface Distribution { + var name: String? var directory: File } \ No newline at end of file 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 b99f600e2c4..cef6633e4c3 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 @@ -24,11 +24,11 @@ interface JsBinary { sealed class JsIrBinary( final override val compilation: KotlinJsCompilation, - override val name: String, + final override val name: String, override val mode: KotlinJsBinaryMode ) : JsBinary { override val distribution: Distribution = - DefaultDistribution(compilation.target.project) + DefaultDistribution(compilation.target.project, name) val linkTaskName: String = linkTaskName() @@ -61,6 +61,12 @@ class Executable( name, mode ) { + override val distribution: Distribution = + DefaultDistribution( + compilation.target.project, + if (mode == KotlinJsBinaryMode.PRODUCTION) null else super.distribution.name + ) + val executeTaskBaseName: String = generateBinaryName( compilation, 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 8a33520de7d..d51d8e44e82 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 @@ -152,26 +152,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : binary as Executable val mode = binary.mode - val webpackTask = registerSubTargetTask( - disambiguateCamelCased( - binary.executeTaskBaseName, - WEBPACK_TASK_NAME - ), - listOf(compilation) - ) { task -> - val entryFileProvider = binary.linkTask.map { it.outputFile } - - task.description = "build webpack ${mode.name.toLowerCase()} bundle" - task._destinationDirectory = distribution.directory - - task.commonConfigure( - compilation = compilation, - mode = mode, - entryFileProvider = entryFileProvider, - configurationActions = webpackTaskConfigurations, - nodeJs = nodeJs - ) - } val distributeResourcesTask = registerSubTargetTask( disambiguateCamelCased( @@ -183,25 +163,49 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : it.into(binary.distribution.directory) } - if (mode == KotlinJsBinaryMode.PRODUCTION) { - assembleTaskProvider.dependsOn(webpackTask) - val webpackCommonTask = registerSubTargetTask( - disambiguateCamelCased(WEBPACK_TASK_NAME) - ) { - it.dependsOn(webpackTask) - } + val webpackTask = registerSubTargetTask( + disambiguateCamelCased( + binary.executeTaskBaseName, + WEBPACK_TASK_NAME + ), + listOf(compilation) + ) { task -> + val entryFileProvider = binary.linkTask.map { it.outputFile } - webpackTask.dependsOn( + task.description = "build webpack ${mode.name.toLowerCase()} bundle" + task._destinationDirectory = binary.distribution.directory + + task.dependsOn( distributeResourcesTask ) - assembleTaskProvider.dependsOn(distributeResourcesTask) + task.commonConfigure( + compilation = compilation, + mode = mode, + entryFileProvider = entryFileProvider, + configurationActions = webpackTaskConfigurations, + nodeJs = nodeJs + ) + } - registerSubTargetTask(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) { - it.dependsOn(webpackCommonTask) - it.dependsOn(distributeResourcesTask) + val distributionTask = registerSubTargetTask( + disambiguateCamelCased( + if (binary.mode == KotlinJsBinaryMode.PRODUCTION) "" else binary.name, + DISTRIBUTION_TASK_NAME + ) + ) { + it.dependsOn(webpackTask) + it.dependsOn(distributeResourcesTask) - it.outputs.dir(project.newFileProperty { distribution.directory }) + it.outputs.dir(project.newFileProperty { binary.distribution.directory }) + } + + if (mode == KotlinJsBinaryMode.PRODUCTION) { + assembleTaskProvider.dependsOn(distributionTask) + registerSubTargetTask( + disambiguateCamelCased(WEBPACK_TASK_NAME) + ) { + it.dependsOn(webpackTask) } } } 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 77c80e6eee8..56bf5e9e8e3 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 @@ -48,11 +48,12 @@ abstract class KotlinJsIrSubTarget( protected val taskGroupName = "Kotlin $disambiguationClassifier" - protected val distribution: Distribution = DefaultDistribution(project) - @ExperimentalDistributionDsl override fun distribution(body: Distribution.() -> Unit) { - distribution.body() + target.binaries + .all { + it.distribution.body() + } } internal fun configure() { @@ -228,19 +229,19 @@ abstract class KotlinJsIrSubTarget( it.into(binary.distribution.directory) } + val distributionTask = registerSubTargetTask( + disambiguateCamelCased( + binary.name, + DISTRIBUTION_TASK_NAME + ) + ) { + it.dependsOn(prepareJsLibrary) + + it.outputs.dir(project.newFileProperty { binary.distribution.directory }) + } + if (mode == KotlinJsBinaryMode.PRODUCTION) { - assembleTaskProvider.dependsOn(prepareJsLibrary) - - registerSubTargetTask( - disambiguateCamelCased( - binary.name, - DISTRIBUTION_TASK_NAME - ) - ) { - it.dependsOn(prepareJsLibrary) - - it.outputs.dir(project.newFileProperty { distribution.directory }) - } + assembleTaskProvider.dependsOn(distributionTask) } } } @@ -261,6 +262,6 @@ abstract class KotlinJsIrSubTarget( const val DISTRIBUTE_RESOURCES_TASK_NAME = "distributeResources" const val DISTRIBUTION_TASK_NAME = "distribution" - const val PREPARE_JS_LIBRARY_TASK_NAME = "prepareJsLibrary" + const val PREPARE_JS_LIBRARY_TASK_NAME = "prepare" } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/DefaultDistribution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/DefaultDistribution.kt index c0bbadfa3f5..12d22176fe6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/DefaultDistribution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/DefaultDistribution.kt @@ -11,12 +11,18 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution import org.jetbrains.kotlin.gradle.utils.property import java.io.File -class DefaultDistribution(private val project: Project) : Distribution { +class DefaultDistribution( + private val project: Project, + override var name: String? = null +) : Distribution { private val basePluginConvention: BasePluginConvention get() = project.convention.plugins["base"] as BasePluginConvention override var directory: File by property { - project.buildDir.resolve(basePluginConvention.distsDirName) + project.buildDir + .let { buildDir -> + name?.let { buildDir.resolve(it) } ?: buildDir.resolve(basePluginConvention.distsDirName) + } } } \ No newline at end of file