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 56bf5e9e8e3..8d0316fe321 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 @@ -200,7 +200,7 @@ abstract class KotlinJsIrSubTarget( } } - private fun configureLibrary(compilation: KotlinJsIrCompilation) { + protected open fun configureLibrary(compilation: KotlinJsIrCompilation) { val project = compilation.target.project val processResourcesTask = target.project.tasks.named(compilation.processResourcesTaskName) 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 bbcdaabd070..c9da0c870fe 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 @@ -11,6 +11,7 @@ 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.locateTask import org.jetbrains.kotlin.gradle.tasks.withType import javax.inject.Inject @@ -37,15 +38,25 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : .getIrBinaries(KotlinJsBinaryMode.DEVELOPMENT) .matching { it is Executable } .all { developmentExecutable -> - val runTaskHolder = NodeJsExec.create(compilation, disambiguateCamelCased(RUN_TASK_NAME)) { - group = taskGroupName - inputFileProperty.set(developmentExecutable.linkTask.flatMap { it.outputFileProperty }) - } - - target.runTask.dependsOn(runTaskHolder) + configureRun(compilation, developmentExecutable) } } + private fun configureRun(compilation: KotlinJsIrCompilation, binary: JsIrBinary) { + val name = disambiguateCamelCased(RUN_TASK_NAME) + val runTask = project.locateTask(name) + if (runTask != null) { + return + } + + val runTaskHolder = NodeJsExec.create(compilation, name) { + group = taskGroupName + inputFileProperty.set(binary.linkTask.flatMap { it.outputFileProperty }) + } + + target.runTask.dependsOn(runTaskHolder) + } + override fun configureBuild( compilation: KotlinJsIrCompilation ) { @@ -56,4 +67,14 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(productionExecutable.linkTask) } } + + override fun configureLibrary(compilation: KotlinJsIrCompilation) { + super.configureLibrary(compilation) + compilation.binaries + .getIrBinaries(KotlinJsBinaryMode.DEVELOPMENT) + .matching { it is Library } + .all { binary -> + configureRun(compilation, binary) + } + } } \ No newline at end of file