[Gradle, JS] Move binaries on compilation level

This commit is contained in:
Ilya Goncharov
2020-02-13 16:14:08 +03:00
parent efb3f16ee4
commit 666b9b3545
8 changed files with 60 additions and 94 deletions
@@ -38,8 +38,8 @@ import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -350,15 +350,15 @@ internal class KotlinJsIrSourceSetProcessor(
it.dependsOn(kotlinTask) it.dependsOn(kotlinTask)
} }
(kotlinCompilation.target as KotlinJsIrTarget).binaries val compilation = kotlinCompilation as KotlinJsIrCompilation
.matching { it.compilation == kotlinCompilation }
.all { binary -> compilation.binaries.all { binary ->
registerKotlinCompileTask( registerKotlinCompileTask(
binary.linkTaskName binary.linkTaskName
) { project, name, action -> ) { project, name, action ->
registerJsLink(project, name, binary.type, action) registerJsLink(project, name, binary.type, action)
}
} }
}
// outputFile can be set later during the configuration phase, get it only after the phase: // outputFile can be set later during the configuration phase, get it only after the phase:
project.runOnceAfterEvaluated("KotlinJsIrSourceSetProcessor.doTargetSpecificProcessing", kotlinTask) { project.runOnceAfterEvaluated("KotlinJsIrSourceSetProcessor.doTargetSpecificProcessing", kotlinTask) {
@@ -8,14 +8,13 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
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.targets.js.dsl.BuildVariantKind import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
sealed class JsBinary( sealed class JsBinary(
internal val target: KotlinTarget,
internal val name: String, internal val name: String,
internal val type: BuildVariantKind, internal val type: BuildVariantKind
internal val compilation: KotlinJsCompilation
) { ) {
val linkTaskName: String = linkTaskName() val linkTaskName: String = linkTaskName()
@@ -33,29 +32,26 @@ sealed class JsBinary(
target.targetName target.targetName
) )
val target: KotlinTarget
get() = compilation.target
val project: Project val project: Project
get() = target.project get() = target.project
} }
class Executable( class Executable(
target: KotlinTarget,
name: String, name: String,
type: BuildVariantKind, type: BuildVariantKind
compilation: KotlinJsCompilation
) : JsBinary( ) : JsBinary(
target,
name, name,
type, type
compilation
) )
class TestExecutable( class TestExecutable(
target: KotlinTarget,
name: String, name: String,
type: BuildVariantKind, type: BuildVariantKind
compilation: KotlinJsCompilation
) : JsBinary( ) : JsBinary(
target,
name, name,
type, type
compilation
) )
@@ -62,13 +62,12 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
override fun configureRun( override fun configureRun(
compilation: KotlinJsIrCompilation compilation: KotlinJsIrCompilation
) { ) {
val project = compilation.target.project val project = compilation.target.project
val nodeJs = NodeJsRootPlugin.apply(project.rootProject) val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val commonRunTask = project.registerTask<Task>(disambiguateCamelCased(RUN_TASK_NAME)) {} val commonRunTask = project.registerTask<Task>(disambiguateCamelCased(RUN_TASK_NAME)) {}
binaries.getBinaries(compilation).all { binary -> compilation.binaries.all { binary ->
val type = binary.type val type = binary.type
val runTask = project.registerTask<KotlinWebpack>( val runTask = project.registerTask<KotlinWebpack>(
@@ -136,15 +135,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(distributeResourcesTask) assembleTask.dependsOn(distributeResourcesTask)
val webpackCommonTask = project.registerTask<Task>(disambiguateCamelCased(WEBPACK_TASK_NAME)) { compilation.binaries.all { binary ->
}
project.registerTask<Task>(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) {
it.dependsOn(webpackCommonTask)
it.dependsOn(distributeResourcesTask)
}
binaries.getBinaries(compilation).all { binary ->
val type = binary.type val type = binary.type
val webpackTask = project.registerTask<KotlinWebpack>( val webpackTask = project.registerTask<KotlinWebpack>(
disambiguateCamelCased( disambiguateCamelCased(
@@ -172,9 +163,13 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
if (type == BuildVariantKind.PRODUCTION) { if (type == BuildVariantKind.PRODUCTION) {
assembleTask.dependsOn(webpackTask) assembleTask.dependsOn(webpackTask)
webpackCommonTask.configure { val webpackCommonTask = project.registerTask<Task>(disambiguateCamelCased(WEBPACK_TASK_NAME)) {
it.dependsOn(webpackTask) it.dependsOn(webpackTask)
} }
project.registerTask<Task>(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) {
it.dependsOn(webpackCommonTask)
it.dependsOn(distributeResourcesTask)
}
} }
} }
} }
@@ -9,8 +9,8 @@ import org.gradle.api.DomainObjectSet
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.ExtensionAware
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.DEVELOPMENT import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.DEVELOPMENT
import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.PRODUCTION import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.PRODUCTION
@@ -21,7 +21,7 @@ import javax.inject.Inject
open class KotlinJsBinaryContainer open class KotlinJsBinaryContainer
@Inject @Inject
constructor( constructor(
val target: KotlinBinaryContainer<KotlinJsCompilation, KotlinJsBinaryContainer>, val target: KotlinBinaryContainer<KotlinJsIrCompilation, KotlinJsBinaryContainer>,
backingContainer: DomainObjectSet<JsBinary> backingContainer: DomainObjectSet<JsBinary>
) : DomainObjectSet<JsBinary> by backingContainer { ) : DomainObjectSet<JsBinary> by backingContainer {
val project: Project val project: Project
@@ -29,46 +29,28 @@ constructor(
private val binaryNames = mutableSetOf<String>() private val binaryNames = mutableSetOf<String>()
private val defaultCompilation: KotlinJsCompilation private val defaultCompilation: KotlinJsIrCompilation
get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
private val defaultTestCompilation: KotlinJsCompilation
get() = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME)
fun executable( fun executable(
compilation: KotlinJsCompilation = defaultCompilation compilation: KotlinJsIrCompilation = defaultCompilation
) = createBinaries( ) = compilation.binaries.executable()
compilation = compilation,
internal fun executable() = createBinaries(
jsBinaryType = JsBinaryType.EXECUTABLE, jsBinaryType = JsBinaryType.EXECUTABLE,
create = ::Executable create = ::Executable
) )
internal fun testExecutable() = createBinaries(
compilation = defaultTestCompilation,
jsBinaryType = JsBinaryType.TEST,
create = ::TestExecutable
)
internal fun getBinaries(
compilation: KotlinJsCompilation
): DomainObjectSet<JsBinary> =
matching { it.compilation == compilation }
internal fun getBinary( internal fun getBinary(
compilation: KotlinJsCompilation,
buildVariantKind: BuildVariantKind buildVariantKind: BuildVariantKind
): JsBinary = ): JsBinary =
getBinaries( matching { it.type == buildVariantKind }
compilation
).matching { it.type == buildVariantKind }
.single() .single()
private fun <T : JsBinary> createBinaries( private fun <T : JsBinary> createBinaries(
compilation: KotlinJsCompilation,
buildVariantKinds: Collection<BuildVariantKind> = listOf(PRODUCTION, DEVELOPMENT), buildVariantKinds: Collection<BuildVariantKind> = listOf(PRODUCTION, DEVELOPMENT),
jsBinaryType: JsBinaryType, jsBinaryType: JsBinaryType,
create: (name: String, buildVariantKind: BuildVariantKind, compilation: KotlinJsCompilation) -> T create: (target: KotlinTarget, name: String, buildVariantKind: BuildVariantKind) -> T
) { ) {
buildVariantKinds.forEach { buildVariantKind -> buildVariantKinds.forEach { buildVariantKind ->
val name = generateBinaryName( val name = generateBinaryName(
@@ -80,7 +62,7 @@ constructor(
"Cannot create binary $name: binary with such a name already exists" "Cannot create binary $name: binary with such a name already exists"
} }
val binary = create(name, buildVariantKind, compilation) val binary = create(target, name, buildVariantKind)
add(binary) add(binary)
// Allow accessing binaries as properties of the container in Groovy DSL. // Allow accessing binaries as properties of the container in Groovy DSL.
if (this is ExtensionAware) { if (this is ExtensionAware) {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.gradle.util.WrapUtil
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
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
@@ -16,6 +17,13 @@ class KotlinJsIrCompilation(
name: String name: String
) : KotlinJsCompilation(target, name) { ) : KotlinJsCompilation(target, name) {
internal val binaries: KotlinJsBinaryContainer =
target.project.objects.newInstance(
KotlinJsBinaryContainer::class.java,
this,
WrapUtil.toDomainObjectSet(JsBinary::class.java)
)
internal val allSources: MutableSet<SourceDirectorySet> = mutableSetOf() internal val allSources: MutableSet<SourceDirectorySet> = mutableSetOf()
override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy<Boolean>) { override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy<Boolean>) {
@@ -36,21 +36,18 @@ abstract class KotlinJsIrSubTarget(
final override lateinit var testRuns: NamedDomainObjectContainer<KotlinJsPlatformTestRun> final override lateinit var testRuns: NamedDomainObjectContainer<KotlinJsPlatformTestRun>
private set private set
protected val binaries: KotlinJsBinaryContainer
get() = target.binaries
internal fun configure() { internal fun configure() {
target.binaries.testExecutable()
NpmResolverPlugin.apply(project) NpmResolverPlugin.apply(project)
configureBuildVariants() configureBuildVariants()
configureTests() configureTests()
binaries.all { binary -> target.compilations.all {
val npmProject = binary.compilation.npmProject val npmProject = it.npmProject
binary.linkTask.configure { it.binaries.all { binary ->
it.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath binary.linkTask.configure {
it.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath
}
} }
} }
} }
@@ -79,6 +76,7 @@ abstract class KotlinJsIrSubTarget(
protected open fun configureTestRunDefaults(testRun: KotlinJsPlatformTestRun) { protected open fun configureTestRunDefaults(testRun: KotlinJsPlatformTestRun) {
target.compilations.matching { it.name == KotlinCompilation.TEST_COMPILATION_NAME }.all { compilation -> target.compilations.matching { it.name == KotlinCompilation.TEST_COMPILATION_NAME }.all { compilation ->
compilation.binaries.executable()
configureTestsRun(testRun, compilation) configureTestsRun(testRun, compilation)
} }
} }
@@ -95,8 +93,7 @@ abstract class KotlinJsIrSubTarget(
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
testJs.description = testTaskDescription testJs.description = testTaskDescription
val testExecutableTask = binaries.getBinary( val testExecutableTask = compilation.binaries.getBinary(
compilation,
BuildVariantKind.DEVELOPMENT BuildVariantKind.DEVELOPMENT
).linkTask ).linkTask
@@ -8,9 +8,9 @@ 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.util.WrapUtil
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer
@@ -48,23 +48,11 @@ constructor(
var producingType: KotlinJsProducingType? = null var producingType: KotlinJsProducingType? = null
override val binaries: KotlinJsBinaryContainer = override val binaries: KotlinJsBinaryContainer
// Use newInstance to allow accessing binaries by their names in Groovy using the extension mechanism. get() = compilations.withType(KotlinJsIrCompilation::class.java)
project.objects.newInstance( .named(MAIN_COMPILATION_NAME)
KotlinJsBinaryContainer::class.java, .map { it.binaries }
this, .get()
WrapUtil.toDomainObjectSet(JsBinary::class.java).apply {
matching { it is Executable }.all {
whenBrowserConfigured {
(this as KotlinJsIrSubTarget).produceExecutable()
}
whenNodejsConfigured {
(this as KotlinJsIrSubTarget).produceExecutable()
}
}
}
)
private val runTaskName get() = lowerCamelCaseName(disambiguationClassifier, runTaskNameSuffix) private val runTaskName get() = lowerCamelCaseName(disambiguationClassifier, runTaskNameSuffix)
val runTask: Task val runTask: Task
@@ -31,7 +31,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
override fun configureRun( override fun configureRun(
compilation: KotlinJsIrCompilation compilation: KotlinJsIrCompilation
) { ) {
val developmentExecutable = binaries.getBinary(compilation, BuildVariantKind.DEVELOPMENT) val developmentExecutable = compilation.binaries.getBinary(BuildVariantKind.DEVELOPMENT)
val runTaskHolder = NodeJsExec.create(compilation, disambiguateCamelCased(RUN_TASK_NAME)) { val runTaskHolder = NodeJsExec.create(compilation, disambiguateCamelCased(RUN_TASK_NAME)) {
inputFileProperty.set(developmentExecutable.linkTask.map { it.outputFileProperty.get() }) inputFileProperty.set(developmentExecutable.linkTask.map { it.outputFileProperty.get() })
@@ -42,7 +42,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
override fun configureBuild( override fun configureBuild(
compilation: KotlinJsIrCompilation compilation: KotlinJsIrCompilation
) { ) {
val productionExecutable = binaries.getBinary(compilation, BuildVariantKind.PRODUCTION) val productionExecutable = compilation.binaries.getBinary(BuildVariantKind.PRODUCTION)
val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
assembleTask.dependsOn(productionExecutable.linkTask) assembleTask.dependsOn(productionExecutable.linkTask)