[Gradle, JS] Compile sync tasks
^KT-41566 fixed
This commit is contained in:
+21
-1
@@ -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"
|
||||
+5
-38
@@ -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"
|
||||
}
|
||||
}
|
||||
+8
-15
@@ -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)
|
||||
|
||||
+42
-1
@@ -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 ->
|
||||
|
||||
+8
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user