Use TCA-compliant Gradle APIs in the JS part of the Kotlin Gradle plugin

This commit is contained in:
Sergey Igushkin
2020-06-06 00:13:29 +03:00
parent 58e9b3ae0e
commit 58dd0fa3d2
14 changed files with 62 additions and 56 deletions
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinJsDce
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
@@ -52,18 +54,18 @@ class KotlinJsDcePlugin : Plugin<Project> {
}
private fun processCompilation(project: Project, kotlinCompilation: KotlinCompilation<*>) {
val kotlinTaskName = kotlinCompilation.compileKotlinTaskName
val kotlinTask = project.tasks.findByName(kotlinTaskName) as? Kotlin2JsCompile ?: return
val kotlinTask = kotlinCompilation.compileKotlinTaskProvider
val dceTaskName = lowerCamelCaseName(
DCE_TASK_PREFIX,
kotlinCompilation.target.disambiguationClassifier,
kotlinCompilation.name.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME },
if (kotlinCompilation.target is KotlinWithJavaTarget<*>) TASK_SUFFIX else MPP_TASK_SUFFIX
)
val dceTask = project.tasks.create(dceTaskName, KotlinJsDce::class.java).also {
val dceTask = project.registerTask<KotlinJsDce>(dceTaskName) {
it.dependsOn(kotlinTask)
project.tasks.findByName("build")!!.dependsOn(it)
}
project.tasks.named("build").dependsOn(dceTask)
project.afterEvaluate {
val outputDir = project.buildDir
@@ -72,10 +74,10 @@ class KotlinJsDcePlugin : Plugin<Project> {
val configuration = project.configurations.getByName(kotlinCompilation.compileDependencyConfigurationName)
with(dceTask) {
classpath = configuration
destinationDir = dceTask.dceOptions.outputDirectory?.let { File(it) } ?: outputDir
source(kotlinTask.outputFile)
dceTask.configure {
it.classpath = configuration
it.destinationDir = it.dceOptions.outputDirectory?.let { File(it) } ?: outputDir
it.source((kotlinTask.get() as Kotlin2JsCompile).outputFile)
}
}
}
@@ -196,7 +196,7 @@ constructor(
override fun useCommonJs() {
compilations.all {
it.compileKotlinTask.kotlinOptions {
it.kotlinOptions {
moduleKind = "commonjs"
sourceMap = true
sourceMapEmbedSources = null
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.api.DefaultTask
import org.gradle.api.attributes.Usage
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
@@ -12,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName
import java.util.concurrent.Callable
@@ -78,11 +80,11 @@ open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) :
compileAllTask.dependsOn(compilation.compileKotlinTaskName)
compileAllTask.dependsOn(compilation.processResourcesTaskName)
} else {
project.tasks.create(compilation.compileAllTaskName).apply {
group = LifecycleBasePlugin.BUILD_GROUP
description = "Assembles outputs for compilation '${compilation.name}' of target '${compilation.target.name}'"
dependsOn(compilation.compileKotlinTaskName)
dependsOn(compilation.processResourcesTaskName)
project.registerTask<DefaultTask>(compilation.compileAllTaskName) {
it.group = LifecycleBasePlugin.BUILD_GROUP
it.description = "Assembles outputs for compilation '${compilation.name}' of target '${compilation.target.name}'"
it.dependsOn(compilation.compileKotlinTaskName)
it.dependsOn(compilation.processResourcesTaskName)
}
}
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.CompilationResolverPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
internal class DukatCompilationResolverPlugin(
@@ -34,7 +35,7 @@ internal class DukatCompilationResolverPlugin(
it.dependsOn(nodeJs.npmInstallTask, npmProject.packageJsonTask)
}
compilation.compileKotlinTask.dependsOn(integratedTask)
compilation.compileKotlinTaskProvider.dependsOn(integratedTask)
project.registerTask<SeparateDukatTask>(
separateTaskName,
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import javax.inject.Inject
open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
@@ -122,8 +123,8 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
it.into(distribution.directory)
}
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(distributeResourcesTask)
val assembleTaskProvider = project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTaskProvider.dependsOn(distributeResourcesTask)
compilation.binaries
.matching { it is Executable }
@@ -153,7 +154,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
}
if (type == KotlinJsBinaryMode.PRODUCTION) {
assembleTask.dependsOn(webpackTask)
assembleTaskProvider.dependsOn(webpackTask)
val webpackCommonTask = registerSubTargetTask<Task>(
disambiguateCamelCased(WEBPACK_TASK_NAME)
) {
@@ -178,12 +179,12 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
dependsOn(
nodeJs.npmInstallTask,
target.project.tasks.getByName(compilation.processResourcesTaskName)
target.project.tasks.named(compilation.processResourcesTaskName)
)
configureOptimization(type)
entryProperty.set(binary.linkTask.map { RegularFile { it.outputFile } })
entryProperty.set(project.layout.file(binary.linkTask.map { it.outputFile }))
commonRunConfigurations.forEach { configure ->
configure()
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.Task
import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME
@@ -158,23 +159,21 @@ constructor(
override fun useCommonJs() {
compilations.all {
it.compileKotlinTask.configureCommonJsOptions()
it.kotlinOptions.configureCommonJsOptions()
binaries
.withType(JsIrBinary::class.java)
.all {
it.linkTask.configure { linkTask ->
linkTask.configureCommonJsOptions()
linkTask.kotlinOptions.configureCommonJsOptions()
}
}
}
}
private fun Kotlin2JsCompile.configureCommonJsOptions() {
kotlinOptions {
moduleKind = "commonjs"
sourceMap = true
sourceMapEmbedSources = null
}
private fun KotlinJsOptions.configureCommonJsOptions() {
moduleKind = "commonjs"
sourceMap = true
sourceMapEmbedSources = null
}
}
@@ -65,7 +65,7 @@ open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) :
super.configureCompilations(target)
target.compilations.all { compilation ->
compilation.compileKotlinTask.kotlinOptions {
compilation.kotlinOptions {
configureOptions()
freeCompilerArgs += listOf(
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.withType
import javax.inject.Inject
open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
@@ -21,7 +23,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
private val runTaskName = disambiguateCamelCased("run")
override fun runTask(body: NodeJsExec.() -> Unit) {
(project.tasks.getByName(runTaskName) as NodeJsExec).body()
project.tasks.withType<NodeJsExec>().named(runTaskName).configure(body)
}
override fun configureDefaultTestFramework(it: KotlinJsTest) {
@@ -47,8 +49,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
) {
compilation.binaries.getIrBinaries(KotlinJsBinaryMode.PRODUCTION)
.all { productionExecutable ->
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(productionExecutable.linkTask)
project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(productionExecutable.linkTask)
}
}
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Compani
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
import org.jetbrains.kotlin.gradle.tasks.registerTask
open class NodeJsRootPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run {
@@ -26,7 +27,7 @@ open class NodeJsRootPlugin : Plugin<Project> {
val settings = this.extensions.create(EXTENSION_NAME, NodeJsRootExtension::class.java, this)
val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java) {
val setupTask = registerTask<NodeJsSetupTask>(NodeJsSetupTask.NAME) {
it.group = TASKS_GROUP_NAME
it.description = "Download and install a local node/npm version"
}
@@ -60,7 +60,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
val npmProject = compilation.npmProject
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val rootClean = project.rootProject.tasks.getByName(BasePlugin.CLEAN_TASK_NAME)
val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME)
val npmInstallTask = nodeJs.npmInstallTask
val packageJsonTaskName = npmProject.packageJsonTaskName
val packageJsonUmbrella = nodeJs.packageJsonUmbrellaTaskProvider
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
@@ -157,8 +158,8 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
it.into(distribution.directory)
}
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(distributeResourcesTask)
val assembleTaskProvider = project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTaskProvider.dependsOn(distributeResourcesTask)
compilation.binaries
.all { binary ->
@@ -191,7 +192,7 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
}
if (type == KotlinJsBinaryMode.PRODUCTION) {
assembleTask.dependsOn(webpackTask)
assembleTaskProvider.dependsOn(webpackTask)
val webpackCommonTask = registerSubTargetTask<Task>(
disambiguateCamelCased(WEBPACK_TASK_NAME)
) {
@@ -227,12 +228,9 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
}
entryProperty.set(
actualDceTaskProvider.map {
RegularFile {
it.destinationDir
.resolve(compilation.compileKotlinTask.outputFile.name)
}
}
project.layout.file(actualDceTaskProvider.map {
it.destinationDir.resolve(compilation.compileKotlinTask.outputFile.name)
})
)
resolveFromModulesFirst = true
@@ -256,7 +254,7 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
DCE_TASK_SUFFIX
)
val kotlinTask = compilation.compileKotlinTask
val kotlinTask = compilation.compileKotlinTaskProvider
return project.registerTask(dceTaskName) {
if (dev) {
@@ -267,15 +265,13 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
}
}
it.dependsOn(kotlinTask)
it.kotlinFilesOnly = true
it.classpath = project.configurations.getByName(compilation.runtimeDependencyConfigurationName)
it.destinationDir = it.dceOptions.outputDirectory?.let { File(it) }
?: compilation.npmProject.dir.resolve(if (dev) DCE_DEV_DIR else DCE_DIR)
it.source(kotlinTask.outputFile)
it.source(kotlinTask.map { it.outputFile })
}
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.withType
import javax.inject.Inject
open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) :
@@ -21,7 +22,7 @@ open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) :
private val runTaskName = disambiguateCamelCased("run")
override fun runTask(body: NodeJsExec.() -> Unit) {
(project.tasks.getByName(runTaskName) as NodeJsExec).body()
project.tasks.withType<NodeJsExec>().named(runTaskName).configure(body)
}
override fun testTask(body: KotlinJsTest.() -> Unit) {
@@ -41,7 +42,7 @@ open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) :
) {
val runTaskHolder = NodeJsExec.create(compilation, disambiguateCamelCased(RUN_TASK_NAME)) {
group = taskGroupName
inputFileProperty.set(compilation.compileKotlinTask.outputFile)
inputFileProperty.set(project.layout.file(compilation.compileKotlinTaskProvider.map { it.outputFile }))
}
target.runTask.dependsOn(runTaskHolder)
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
import org.jetbrains.kotlin.gradle.tasks.registerTask
open class YarnPlugin : Plugin<Project> {
override fun apply(project: Project): Unit = project.run {
@@ -25,7 +26,7 @@ open class YarnPlugin : Plugin<Project> {
val yarnRootExtension = this.extensions.create(YarnRootExtension.YARN, YarnRootExtension::class.java, this)
val nodeJs = NodeJsRootPlugin.apply(this)
tasks.create(YarnSetupTask.NAME, YarnSetupTask::class.java) {
registerTask<YarnSetupTask>(YarnSetupTask.NAME) {
it.dependsOn(nodeJs.nodeJsSetupTask)
}
@@ -11,6 +11,7 @@ import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.testing.AbstractTestTask
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.tasks.locateTask
@@ -32,8 +33,8 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = "
taskHolder: TaskProvider<out AbstractTestTask>,
aggregate: TaskProvider<KotlinTestReport> = allTestsTask
) {
project.tasks.getByName(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(taskHolder.name)
project.cleanAllTestTask.dependsOn(cleanTaskName(taskHolder.name))
project.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(taskHolder)
project.cleanAllTestTask.configure { it.dependsOn(cleanTaskName(taskHolder.name)) }
aggregate.configure {
it.dependsOn(taskHolder.name)
it.registerTestTask(taskHolder.get())
@@ -95,12 +96,12 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = "
return "clean" + taskName.capitalize()
}
private val Project.cleanAllTestTask: Task
private val Project.cleanAllTestTask: TaskProvider<*>
get() {
val taskName = cleanTaskName(allTestsTask.name)
return tasks.findByName(taskName)
?: tasks.create(taskName, Task::class.java).also {
tasks.getByName(LifecycleBasePlugin.CLEAN_TASK_NAME).dependsOn(it)
return project.locateTask<Task>(taskName)
?: project.registerTask<Task>(taskName).also { cleanAllTest ->
tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME).dependsOn(cleanAllTest)
}
}