From 06a54c87a06d99204028e27e0ed15c95b01501bf Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 28 Aug 2020 15:01:19 +0300 Subject: [PATCH] [Gradle, JS] Compile sync tasks ^KT-41566 fixed --- .../kotlin/gradle/targets/js/ir/JsBinaries.kt | 22 +++++++++- .../gradle/targets/js/ir/KotlinBrowserJsIr.kt | 43 +++---------------- .../targets/js/ir/KotlinJsIrSubTarget.kt | 23 ++++------ .../gradle/targets/js/ir/KotlinJsIrTarget.kt | 43 ++++++++++++++++++- .../gradle/targets/js/ir/KotlinNodeJsIr.kt | 9 +++- 5 files changed, 84 insertions(+), 56 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt index cef6633e4c3..12c3f5f5eae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt @@ -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 + get() = target.project.tasks + .withType() + .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 - ) \ No newline at end of file + ) + +internal val COMPILE_SYNC = "compileSync" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index d51d8e44e82..14ab7410bc5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -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( 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 { - 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" } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index 8d0316fe321..831b262fa0d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index c5efccc5fd5..49f454e2043 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -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 { + 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 -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt index 1de4d2ef446..cf812a4b088 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt @@ -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)