[Gradle, JS] Add distribution DSL

This commit is contained in:
Ilya Goncharov
2019-12-02 17:33:18 +03:00
parent fe9ddd9f22
commit c267357596
6 changed files with 75 additions and 27 deletions
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.dsl
import java.io.File
interface Distribution {
var directory: File?
}
@@ -0,0 +1,10 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.dsl
@Experimental(level = Experimental.Level.WARNING)
@Target(AnnotationTarget.FUNCTION)
annotation class ExperimentalDistributionDsl
@@ -54,6 +54,16 @@ interface KotlinJsBrowserDsl : KotlinJsSubTargetDsl {
}
}
@ExperimentalDistributionDsl
fun distribution(body: Distribution.() -> Unit)
@ExperimentalDistributionDsl
fun distribution(fn: Closure<*>) {
distribution {
ConfigureUtil.configure(fn, this)
}
}
fun webpackTask(body: KotlinWebpack.() -> Unit)
fun webpackTask(fn: Closure<*>) {
webpackTask {
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.subtargets
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution
import java.io.File
class BrowserDistribution : Distribution {
override var directory: File? = null
}
@@ -7,16 +7,15 @@ package org.jetbrains.kotlin.gradle.targets.js.subtargets
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Task
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.tasks.Copy
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.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariant
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.*
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
@@ -37,6 +36,7 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
private val commonWebpackConfigurations: MutableList<KotlinWebpack.() -> Unit> = mutableListOf()
private val commonRunConfigurations: MutableList<KotlinWebpack.() -> Unit> = mutableListOf()
private val dceConfigurations: MutableList<KotlinJsDce.() -> Unit> = mutableListOf()
private val distribution: Distribution = BrowserDistribution()
private lateinit var buildVariants: NamedDomainObjectContainer<BuildVariant>
@@ -53,6 +53,11 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
commonRunConfigurations.add(body)
}
@ExperimentalDistributionDsl
override fun distribution(body: Distribution.() -> Unit) {
distribution.body()
}
override fun webpackTask(body: KotlinWebpack.() -> Unit) {
commonWebpackConfigurations.add(body)
}
@@ -143,6 +148,22 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
val compileKotlinTask = compilation.compileKotlinTask
val basePluginConvention = project.convention.plugins["base"] as BasePluginConvention?
distribution.directory = distribution.directory ?: project.buildDir.resolve(basePluginConvention!!.distsDirName)
val distributionTask = project.registerTask<Copy>(
disambiguateCamelCased(
DISTRIBUTION_TASK_NAME
)
) {
it.from(compilation.output.resourcesDir)
it.into(distribution.directory!!)
}
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(distributionTask)
buildVariants.all { buildVariant ->
val kind = buildVariant.kind
val webpackTask = project.registerTask<KotlinWebpack>(
@@ -154,13 +175,15 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
) {
it.dependsOn(
nodeJs.npmInstallTask,
target.project.tasks.getByName(compilation.processResourcesTaskName)
target.project.tasks.getByName(compilation.processResourcesTaskName),
distributionTask
)
it.configureOptimization(kind)
it.compilation = compilation
it.description = "build webpack ${kind.name.toLowerCase()} bundle"
it.destinationDirectory = distribution.directory
when (kind) {
BuildVariantKind.PRODUCTION -> {
@@ -180,21 +203,10 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
commonWebpackConfigurations.forEach { configure ->
it.configure()
}
it.doLast { _ ->
val resourcesDir = compilation.output.resourcesDir
if (resourcesDir.exists()) {
resourcesDir
.copyRecursively(
target = it.destinationDirectory!!,
overwrite = true
)
}
}
}
if (kind == BuildVariantKind.PRODUCTION) {
project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(webpackTask)
assembleTask.dependsOn(webpackTask)
project.registerTask<Task>(disambiguateCamelCased(WEBPACK_TASK_NAME)) {
it.dependsOn(webpackTask)
}
@@ -274,5 +286,6 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
const val DEVELOPMENT = "development"
private const val WEBPACK_TASK_NAME = "webpack"
private const val DISTRIBUTION_TASK_NAME = "distribution"
}
}
@@ -101,16 +101,6 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
open val evaluatedConfigFile: File
@OutputFile get() = reportDir.resolve("webpack.config.evaluated.js")
val resourcesDir: File?
@Optional
@InputDirectory
get() {
val resourcesDir = compilation.output.resourcesDir
return if (resourcesDir.exists()) {
resourcesDir
} else null
}
@Input
var bin: String = "webpack/bin/webpack.js"