[Gradle, JS] Add distribute resources tasks for all binaries

^KT-41566 fixed
This commit is contained in:
Ilya Goncharov
2020-08-21 14:08:27 +03:00
parent cc25660d7d
commit c9ca05b477
4 changed files with 46 additions and 38 deletions
@@ -9,21 +9,27 @@ import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation 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.dsl.KotlinJsBinaryMode
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsBinaryContainer.Companion.generateBinaryName 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 import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
interface JsBinary { interface JsBinary {
val compilation: KotlinJsCompilation val compilation: KotlinJsCompilation
val name: String val name: String
val mode: KotlinJsBinaryMode val mode: KotlinJsBinaryMode
val distribution: Distribution
} }
sealed class JsIrBinary( sealed class JsIrBinary(
override val compilation: KotlinJsCompilation, final override val compilation: KotlinJsCompilation,
override val name: String, override val name: String,
override val mode: KotlinJsBinaryMode override val mode: KotlinJsBinaryMode
) : JsBinary { ) : JsBinary {
override val distribution: Distribution =
BrowserDistribution(compilation.target.project)
val linkTaskName: String = linkTaskName() val linkTaskName: String = linkTaskName()
val linkTask: TaskProvider<KotlinJsIrLink> val linkTask: TaskProvider<KotlinJsIrLink>
@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Sync import org.gradle.api.tasks.Sync
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation 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.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest 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 project = compilation.target.project
val nodeJs = NodeJsRootPlugin.apply(project.rootProject) 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) val assembleTaskProvider = project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
compilation.binaries compilation.binaries
@@ -156,10 +160,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
) { task -> ) { task ->
val entryFileProvider = binary.linkTask.map { it.outputFile } val entryFileProvider = binary.linkTask.map { it.outputFile }
task.dependsOn(
distributeResourcesTask
)
task.description = "build webpack ${mode.name.toLowerCase()} bundle" task.description = "build webpack ${mode.name.toLowerCase()} bundle"
task._destinationDirectory = distribution.directory task._destinationDirectory = distribution.directory
@@ -172,6 +172,16 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
) )
} }
val distributeResourcesTask = registerSubTargetTask<Copy>(
disambiguateCamelCased(
binary.name,
DISTRIBUTE_RESOURCES_TASK_NAME
)
) {
it.from(processResourcesTask)
it.into(binary.distribution.directory)
}
if (mode == KotlinJsBinaryMode.PRODUCTION) { if (mode == KotlinJsBinaryMode.PRODUCTION) {
assembleTaskProvider.dependsOn(webpackTask) assembleTaskProvider.dependsOn(webpackTask)
val webpackCommonTask = registerSubTargetTask<Task>( val webpackCommonTask = registerSubTargetTask<Task>(
@@ -179,6 +189,13 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
) { ) {
it.dependsOn(webpackTask) it.dependsOn(webpackTask)
} }
webpackTask.dependsOn(
distributeResourcesTask
)
assembleTaskProvider.dependsOn(distributeResourcesTask)
registerSubTargetTask<Task>(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) { registerSubTargetTask<Task>(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) {
it.dependsOn(webpackCommonTask) it.dependsOn(webpackCommonTask)
it.dependsOn(distributeResourcesTask) it.dependsOn(distributeResourcesTask)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.DomainObjectSet import org.gradle.api.DomainObjectSet
import org.gradle.api.GradleException
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.ExtensionAware
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation 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.KotlinTargetWithBinaries
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget 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
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.DEVELOPMENT 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.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.targets.js.subtargets.KotlinJsSubTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject import javax.inject.Inject
@@ -39,7 +42,7 @@ constructor(
@JvmOverloads @JvmOverloads
fun executable( fun executable(
compilation: KotlinJsCompilation = defaultCompilation compilation: KotlinJsCompilation = defaultCompilation
) { ): List<JsBinary> {
if (target is KotlinJsIrTarget) { if (target is KotlinJsIrTarget) {
target.whenBrowserConfigured { target.whenBrowserConfigured {
(this as KotlinJsIrSubTarget).produceExecutable() (this as KotlinJsIrSubTarget).produceExecutable()
@@ -49,7 +52,7 @@ constructor(
(this as KotlinJsIrSubTarget).produceExecutable() (this as KotlinJsIrSubTarget).produceExecutable()
} }
compilation.binaries.executableIrInternal(compilation) return compilation.binaries.executableIrInternal(compilation)
} }
if (target is KotlinJsTarget) { if (target is KotlinJsTarget) {
@@ -64,11 +67,13 @@ constructor(
(this as KotlinJsSubTarget).produceExecutable() (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<JsBinary> = createBinaries(
compilation = compilation, compilation = compilation,
jsBinaryType = KotlinJsBinaryType.EXECUTABLE, jsBinaryType = KotlinJsBinaryType.EXECUTABLE,
create = ::Executable create = ::Executable
@@ -82,6 +87,7 @@ constructor(
override val compilation: KotlinJsCompilation = compilation override val compilation: KotlinJsCompilation = compilation
override val name: String = name override val name: String = name
override val mode: KotlinJsBinaryMode = type override val mode: KotlinJsBinaryMode = type
override val distribution: Distribution = BrowserDistribution(compilation.target.project)
} }
} }
) )
@@ -97,8 +103,8 @@ constructor(
modes: Collection<KotlinJsBinaryMode> = listOf(PRODUCTION, DEVELOPMENT), modes: Collection<KotlinJsBinaryMode> = listOf(PRODUCTION, DEVELOPMENT),
jsBinaryType: KotlinJsBinaryType, jsBinaryType: KotlinJsBinaryType,
create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T
) { ) =
modes.forEach { modes.map {
createBinary( createBinary(
compilation, compilation,
it, it,
@@ -106,14 +112,13 @@ constructor(
create create
) )
} }
}
private fun <T : JsBinary> createBinary( private fun <T : JsBinary> createBinary(
compilation: KotlinJsCompilation, compilation: KotlinJsCompilation,
mode: KotlinJsBinaryMode, mode: KotlinJsBinaryMode,
jsBinaryType: KotlinJsBinaryType, jsBinaryType: KotlinJsBinaryType,
create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T create: (compilation: KotlinJsCompilation, name: String, mode: KotlinJsBinaryMode) -> T
) { ): JsBinary {
val name = generateBinaryName( val name = generateBinaryName(
compilation, compilation,
mode, mode,
@@ -121,7 +126,7 @@ constructor(
) )
if (name in binaryNames) { if (name in binaryNames) {
return return single { it.name == name }
} }
binaryNames.add(name) binaryNames.add(name)
@@ -132,6 +137,8 @@ constructor(
if (this is ExtensionAware) { if (this is ExtensionAware) {
extensions.add(binary.name, binary) extensions.add(binary.name, binary)
} }
return binary
} }
companion object { companion object {
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator 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.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.subtargets.BrowserDistribution import org.jetbrains.kotlin.gradle.targets.js.subtargets.BrowserDistribution
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest 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.tasks.registerTask
import org.jetbrains.kotlin.gradle.testing.internal.configureConventions import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
@@ -186,26 +184,6 @@ abstract class KotlinJsIrSubTarget(
} }
protected fun configureDistributeTasks(compilation: KotlinJsIrCompilation): TaskProvider<out Copy> {
val project = compilation.target.project
val processResourcesTask = target.project.tasks.named(compilation.processResourcesTaskName)
val distributeResourcesTask = registerSubTargetTask<Copy>(
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 <reified T : Task> registerSubTargetTask( internal inline fun <reified T : Task> registerSubTargetTask(
name: String, name: String,
args: List<Any> = emptyList(), args: List<Any> = emptyList(),