[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.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<KotlinJsIrLink>
@@ -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<Copy>(
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<Task>(
@@ -179,6 +189,13 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
) {
it.dependsOn(webpackTask)
}
webpackTask.dependsOn(
distributeResourcesTask
)
assembleTaskProvider.dependsOn(distributeResourcesTask)
registerSubTargetTask<Task>(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) {
it.dependsOn(webpackCommonTask)
it.dependsOn(distributeResourcesTask)
@@ -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<JsBinary> {
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<JsBinary> = 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<KotlinJsBinaryMode> = 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 <T : JsBinary> 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 {
@@ -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<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(
name: String,
args: List<Any> = emptyList(),