[Gradle, JS] Compile sync tasks
^KT-41566 fixed
This commit is contained in:
+20
@@ -6,13 +6,16 @@
|
|||||||
package org.jetbrains.kotlin.gradle.targets.js.ir
|
package org.jetbrains.kotlin.gradle.targets.js.ir
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.tasks.Copy
|
||||||
import org.gradle.api.tasks.TaskProvider
|
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.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
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.Distribution
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
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.ir.KotlinJsBinaryContainer.Companion.generateBinaryName
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.subtargets.DefaultDistribution
|
import org.jetbrains.kotlin.gradle.targets.js.subtargets.DefaultDistribution
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.withType
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
|
||||||
interface JsBinary {
|
interface JsBinary {
|
||||||
@@ -45,6 +48,21 @@ sealed class JsIrBinary(
|
|||||||
target.targetName
|
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
|
val target: KotlinTarget
|
||||||
get() = compilation.target
|
get() = compilation.target
|
||||||
|
|
||||||
@@ -99,3 +117,5 @@ internal val JsBinary.executeTaskBaseName: String
|
|||||||
mode,
|
mode,
|
||||||
null
|
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.Task
|
||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
import org.gradle.api.tasks.Copy
|
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.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
|
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.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
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.KotlinWebpackConfig.Mode
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
|
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
|
||||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
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 org.jetbrains.kotlin.gradle.utils.newFileProperty
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -92,10 +87,6 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
|||||||
|
|
||||||
val mode = binary.mode
|
val mode = binary.mode
|
||||||
|
|
||||||
val runCompileSync = registerRunCompileSync(
|
|
||||||
binary
|
|
||||||
)
|
|
||||||
|
|
||||||
val runTask = registerSubTargetTask<KotlinWebpack>(
|
val runTask = registerSubTargetTask<KotlinWebpack>(
|
||||||
disambiguateCamelCased(
|
disambiguateCamelCased(
|
||||||
binary.executeTaskBaseName,
|
binary.executeTaskBaseName,
|
||||||
@@ -103,7 +94,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
|||||||
),
|
),
|
||||||
listOf(compilation)
|
listOf(compilation)
|
||||||
) { task ->
|
) { task ->
|
||||||
val entryFileProvider = runCompileSync.map {
|
val entryFileProvider = binary.linkSyncTask.map {
|
||||||
it.destinationDir
|
it.destinationDir
|
||||||
.resolve(binary.linkTask.get().outputFile.name)
|
.resolve(binary.linkTask.get().outputFile.name)
|
||||||
}
|
}
|
||||||
@@ -170,7 +161,10 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
|||||||
),
|
),
|
||||||
listOf(compilation)
|
listOf(compilation)
|
||||||
) { task ->
|
) { 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.description = "build webpack ${mode.name.toLowerCase()} bundle"
|
||||||
task._destinationDirectory = binary.distribution.directory
|
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(
|
private fun KotlinWebpack.commonConfigure(
|
||||||
compilation: KotlinJsCompilation,
|
compilation: KotlinJsCompilation,
|
||||||
mode: KotlinJsBinaryMode,
|
mode: KotlinJsBinaryMode,
|
||||||
@@ -284,7 +253,5 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val WEBPACK_TASK_NAME = "webpack"
|
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.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin
|
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.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.targets.js.testing.KotlinJsTest
|
||||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
@@ -60,17 +59,6 @@ abstract class KotlinJsIrSubTarget(
|
|||||||
NpmResolverPlugin.apply(project)
|
NpmResolverPlugin.apply(project)
|
||||||
|
|
||||||
configureTests()
|
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 {
|
private val produceExecutable: Unit by lazy {
|
||||||
@@ -127,12 +115,17 @@ abstract class KotlinJsIrSubTarget(
|
|||||||
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
||||||
testJs.description = testTaskDescription
|
testJs.description = testTaskDescription
|
||||||
|
|
||||||
val testExecutableTask = compilation.binaries.getIrBinaries(
|
val binary = compilation.binaries.getIrBinaries(
|
||||||
KotlinJsBinaryMode.DEVELOPMENT
|
KotlinJsBinaryMode.DEVELOPMENT
|
||||||
).single().linkTask
|
).single()
|
||||||
|
|
||||||
testJs.inputFileProperty.set(
|
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)
|
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.NamedDomainObjectContainer
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.Task
|
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.dsl.KotlinJsOptions
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix
|
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.KotlinJsNodeDsl
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
|
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 org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import javax.inject.Inject
|
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 {
|
private val browserLazyDelegate = lazy {
|
||||||
|
commonLazy
|
||||||
project.objects.newInstance(KotlinBrowserJsIr::class.java, this).also {
|
project.objects.newInstance(KotlinBrowserJsIr::class.java, this).also {
|
||||||
it.configureSubTarget()
|
it.configureSubTarget()
|
||||||
browserConfiguredHandlers.forEach { handler ->
|
browserConfiguredHandlers.forEach { handler ->
|
||||||
@@ -115,6 +155,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val nodejsLazyDelegate = lazy {
|
private val nodejsLazyDelegate = lazy {
|
||||||
|
commonLazy
|
||||||
project.objects.newInstance(KotlinNodeJsIr::class.java, this).also {
|
project.objects.newInstance(KotlinNodeJsIr::class.java, this).also {
|
||||||
it.configureSubTarget()
|
it.configureSubTarget()
|
||||||
nodejsConfiguredHandlers.forEach { handler ->
|
nodejsConfiguredHandlers.forEach { handler ->
|
||||||
|
|||||||
+8
-1
@@ -65,7 +65,14 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
|||||||
if (runTask == null) {
|
if (runTask == null) {
|
||||||
val runTaskHolder = NodeJsExec.create(binary.compilation, name) {
|
val runTaskHolder = NodeJsExec.create(binary.compilation, name) {
|
||||||
group = taskGroupName
|
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)
|
target.runTask.dependsOn(runTaskHolder)
|
||||||
|
|||||||
Reference in New Issue
Block a user