[Gradle, JS] Compile sync tasks

^KT-41566 fixed
This commit is contained in:
Ilya Goncharov
2020-08-28 15:01:19 +03:00
parent 9729554313
commit 06a54c87a0
5 changed files with 84 additions and 56 deletions
@@ -6,13 +6,16 @@
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
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.DefaultDistribution
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
interface JsBinary {
@@ -45,6 +48,21 @@ sealed class JsIrBinary(
target.targetName
)
val linkSyncTaskName: String = linkSyncTaskName()
val linkSyncTask: TaskProvider<Copy>
get() = target.project.tasks
.withType<Copy>()
.named(linkSyncTaskName)
private fun linkSyncTaskName(): String =
lowerCamelCaseName(
compilation.target.disambiguationClassifier,
compilation.name.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME },
name,
COMPILE_SYNC
)
val target: KotlinTarget
get() = compilation.target
@@ -98,4 +116,6 @@ internal val JsBinary.executeTaskBaseName: String
compilation,
mode,
null
)
)
internal val COMPILE_SYNC = "compileSync"
@@ -8,11 +8,8 @@ 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.ExperimentalDceDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
@@ -26,8 +23,6 @@ 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.utils.decamelize
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.newFileProperty
import java.io.File
import javax.inject.Inject
@@ -92,10 +87,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
val mode = binary.mode
val runCompileSync = registerRunCompileSync(
binary
)
val runTask = registerSubTargetTask<KotlinWebpack>(
disambiguateCamelCased(
binary.executeTaskBaseName,
@@ -103,7 +94,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
),
listOf(compilation)
) { task ->
val entryFileProvider = runCompileSync.map {
val entryFileProvider = binary.linkSyncTask.map {
it.destinationDir
.resolve(binary.linkTask.get().outputFile.name)
}
@@ -170,7 +161,10 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
),
listOf(compilation)
) { task ->
val entryFileProvider = binary.linkTask.map { it.outputFile }
val entryFileProvider = binary.linkSyncTask.map {
it.destinationDir
.resolve(binary.linkTask.get().outputFile.name)
}
task.description = "build webpack ${mode.name.toLowerCase()} bundle"
task._destinationDirectory = binary.distribution.directory
@@ -211,31 +205,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
}
}
private fun registerRunCompileSync(binary: Executable): TaskProvider<Sync> {
val compilation = binary.compilation
val runCompileSyncTaskName = lowerCamelCaseName(
compilation.target.disambiguationClassifier,
compilation.name.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME },
binary.name,
RUN_COMPILE_COPY
)
return registerSubTargetTask(
runCompileSyncTaskName
) { task ->
task.from(
project.layout.file(binary.linkTask.map { it.destinationDir })
)
task.into(
binary.linkTask.map {
it.destinationDir.parentFile
.resolve(binary.name.decamelize())
}
)
}
}
private fun KotlinWebpack.commonConfigure(
compilation: KotlinJsCompilation,
mode: KotlinJsBinaryMode,
@@ -284,7 +253,5 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
companion object {
private const val WEBPACK_TASK_NAME = "webpack"
private const val RUN_COMPILE_COPY = "runCompileSync"
}
}
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
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.DefaultDistribution
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
@@ -60,17 +59,6 @@ abstract class KotlinJsIrSubTarget(
NpmResolverPlugin.apply(project)
configureTests()
target.compilations.all {
val npmProject = it.npmProject
it.binaries
.withType(JsIrBinary::class.java)
.all { binary ->
binary.linkTask.configure {
it.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath
}
}
}
}
private val produceExecutable: Unit by lazy {
@@ -127,12 +115,17 @@ abstract class KotlinJsIrSubTarget(
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
testJs.description = testTaskDescription
val testExecutableTask = compilation.binaries.getIrBinaries(
val binary = compilation.binaries.getIrBinaries(
KotlinJsBinaryMode.DEVELOPMENT
).single().linkTask
).single()
testJs.inputFileProperty.set(
testExecutableTask.flatMap { it.outputFileProperty }
project.layout.file(
binary.linkSyncTask.map {
it.destinationDir
.resolve(binary.linkTask.get().outputFile.name)
}
)
)
testJs.dependsOn(nodeJs.npmInstallTaskProvider, nodeJs.nodeJsSetupTaskProvider)
@@ -8,6 +8,8 @@ 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.gradle.api.tasks.Copy
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix
@@ -21,7 +23,8 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject
@@ -93,7 +96,44 @@ constructor(
}
}
private val commonLazy by lazy {
compilations.all { compilation ->
val npmProject = compilation.npmProject
compilation.binaries
.withType(JsIrBinary::class.java)
.all { binary ->
val syncTask = registerCompileSync(binary)
binary.linkTask.configure {
it.kotlinOptions.outputFile = project.buildDir
.resolve(COMPILE_SYNC)
.resolve(npmProject.main)
.canonicalPath
it.finalizedBy(syncTask)
}
}
}
}
private fun registerCompileSync(binary: JsIrBinary): TaskProvider<Copy> {
val compilation = binary.compilation
val npmProject = compilation.npmProject
return project.registerTask(
binary.linkSyncTaskName
) { task ->
task.from(
project.layout.file(binary.linkTask.map { it.destinationDir })
)
task.into(
npmProject.dist
)
}
}
private val browserLazyDelegate = lazy {
commonLazy
project.objects.newInstance(KotlinBrowserJsIr::class.java, this).also {
it.configureSubTarget()
browserConfiguredHandlers.forEach { handler ->
@@ -115,6 +155,7 @@ constructor(
}
private val nodejsLazyDelegate = lazy {
commonLazy
project.objects.newInstance(KotlinNodeJsIr::class.java, this).also {
it.configureSubTarget()
nodejsConfiguredHandlers.forEach { handler ->
@@ -65,7 +65,14 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
if (runTask == null) {
val runTaskHolder = NodeJsExec.create(binary.compilation, name) {
group = taskGroupName
inputFileProperty.set(binary.linkTask.flatMap { it.outputFileProperty })
inputFileProperty.set(
project.layout.file(
binary.linkSyncTask.map {
it.destinationDir
.resolve(binary.linkTask.get().outputFile.name)
}
)
)
}
target.runTask.dependsOn(runTaskHolder)