From c2673575969dd3ab99861d2fa861214b0d635457 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 2 Dec 2019 17:33:18 +0300 Subject: [PATCH] [Gradle, JS] Add distribution DSL --- .../gradle/targets/js/dsl/Distribution.kt | 12 +++++ .../js/dsl/ExperimentalDistributionDsl.kt | 10 ++++ .../targets/js/dsl/KotlinJsTargetDsl.kt | 10 ++++ .../js/subtargets/BrowserDistribution.kt | 13 +++++ .../targets/js/subtargets/KotlinBrowserJs.kt | 47 ++++++++++++------- .../targets/js/webpack/KotlinWebpack.kt | 10 ---- 6 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/ExperimentalDistributionDsl.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/BrowserDistribution.kt 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 new file mode 100644 index 00000000000..aba2e00d456 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/Distribution.kt @@ -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? +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/ExperimentalDistributionDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/ExperimentalDistributionDsl.kt new file mode 100644 index 00000000000..fc9bdad096f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/ExperimentalDistributionDsl.kt @@ -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 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt index a592afcec46..109bb22ee1e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt @@ -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 { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/BrowserDistribution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/BrowserDistribution.kt new file mode 100644 index 00000000000..70a196b1b82 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/BrowserDistribution.kt @@ -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 +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index 3e93e8474f0..9df5ebae41a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -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 Unit> = mutableListOf() private val commonRunConfigurations: MutableList Unit> = mutableListOf() private val dceConfigurations: MutableList Unit> = mutableListOf() + private val distribution: Distribution = BrowserDistribution() private lateinit var buildVariants: NamedDomainObjectContainer @@ -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( + 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( @@ -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(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" } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index 88020d2d568..e649d3413aa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -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"