Add test tasks to targets configured with KotlinTargetConfigurator

This commit is contained in:
Sergey Igushkin
2018-07-13 23:14:49 +03:00
parent cb99f43033
commit 7b6764c9ae
2 changed files with 48 additions and 21 deletions
@@ -20,7 +20,9 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.internal.artifacts.ArtifactAttributes
import org.gradle.api.internal.plugins.DslObject import org.gradle.api.internal.plugins.DslObject
import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.BasePlugin
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.testing.Test
import org.gradle.internal.cleanup.BuildOutputCleanupRegistry import org.gradle.internal.cleanup.BuildOutputCleanupRegistry
import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.language.jvm.tasks.ProcessResources
@@ -30,6 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.mpp.fullName import org.jetbrains.kotlin.gradle.plugin.mpp.fullName
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File import java.io.File
import java.util.concurrent.Callable import java.util.concurrent.Callable
@@ -37,22 +40,20 @@ open class KotlinTargetConfigurator(
private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry
) { ) {
fun <KotlinCompilationType: KotlinCompilation> configureTarget( fun <KotlinCompilationType: KotlinCompilation> configureTarget(
project: Project,
target: KotlinOnlyTarget<KotlinCompilationType> target: KotlinOnlyTarget<KotlinCompilationType>
) { ) {
configureCompilationDefaults(project, target) configureCompilationDefaults(target)
configureCompilations(project, target) configureCompilations(target)
defineConfigurationsForTarget(project, target) defineConfigurationsForTarget(target)
configureArchivesAndComponent(project, target) configureArchivesAndComponent(target)
configureBuild(project, target) configureTest(target)
configureBuild(target)
setCompatibilityOfAbstractCompileTasks(project) setCompatibilityOfAbstractCompileTasks(target.project)
} }
private fun <KotlinCompilationType: KotlinCompilation> configureCompilations( private fun <KotlinCompilationType: KotlinCompilation> configureCompilations(platformTarget: KotlinOnlyTarget<KotlinCompilationType>) {
project: Project, val project = platformTarget.project
platformTarget: KotlinOnlyTarget<KotlinCompilationType>
) {
val main = platformTarget.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME) val main = platformTarget.compilations.create(KotlinCompilation.MAIN_COMPILATION_NAME)
platformTarget.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME).apply { platformTarget.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME).apply {
@@ -68,7 +69,9 @@ open class KotlinTargetConfigurator(
} }
} }
private fun <KotlinCompilationType: KotlinCompilation> configureCompilationDefaults(project: Project, target: KotlinOnlyTarget<KotlinCompilationType>) { private fun <KotlinCompilationType: KotlinCompilation> configureCompilationDefaults(target: KotlinOnlyTarget<KotlinCompilationType>) {
val project = target.project
target.compilations.all { compilation -> target.compilations.all { compilation ->
defineConfigurationsForCompilation(compilation, target, project.configurations) defineConfigurationsForCompilation(compilation, target, project.configurations)
@@ -77,14 +80,16 @@ open class KotlinTargetConfigurator(
} }
if (compilation is KotlinCompilationWithResources) { if (compilation is KotlinCompilationWithResources) {
configureResourceProcessing(project, compilation, project.files()) configureResourceProcessing(compilation, project.files())
} }
createLifecycleTask(compilation, project) createLifecycleTask(compilation)
} }
} }
private fun configureArchivesAndComponent(project: Project, target: KotlinOnlyTarget<*>) { private fun configureArchivesAndComponent(target: KotlinOnlyTarget<*>) {
val project = target.project
val mainCompilation = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) val mainCompilation = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
val jar = project.tasks.create(target.artifactsTaskName, Jar::class.java) val jar = project.tasks.create(target.artifactsTaskName, Jar::class.java)
@@ -92,7 +97,6 @@ open class KotlinTargetConfigurator(
jar.group = BasePlugin.BUILD_GROUP jar.group = BasePlugin.BUILD_GROUP
jar.from(mainCompilation.output) jar.from(mainCompilation.output)
val jarArtifact = ArchivePublishArtifact(jar)
val apiElementsConfiguration = project.configurations.getByName(target.apiElementsConfigurationName) val apiElementsConfiguration = project.configurations.getByName(target.apiElementsConfigurationName)
target.disambiguationClassifier?.let { jar.classifier = it } target.disambiguationClassifier?.let { jar.classifier = it }
@@ -125,11 +129,27 @@ open class KotlinTargetConfigurator(
publications.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.JAR_TYPE) publications.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.JAR_TYPE)
} }
private fun configureTest(target: KotlinTarget) {
val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) as? KotlinCompilationToRunnableFiles
?: return // Otherwise, there is no runtime classpath
target.project.tasks.create(lowerCamelCaseName(target.targetName, testTaskNameSuffix), Test::class.java).apply {
project.afterEvaluate { // use afterEvaluate to override the JavaPlugin defaults for Test tasks
conventionMapping.map("testClassesDirs") { testCompilation.output.classesDirs }
conventionMapping.map("classpath") { testCompilation.runtimeDependencyFiles }
description = "Runs the unit tests."
group = JavaBasePlugin.VERIFICATION_GROUP
target.project.tasks.findByName(JavaBasePlugin.CHECK_TASK_NAME)?.dependsOn(this@apply)
}
}
}
private fun configureResourceProcessing( private fun configureResourceProcessing(
project: Project,
compilation: KotlinCompilationWithResources, compilation: KotlinCompilationWithResources,
resourceSet: FileCollection resourceSet: FileCollection
) { ) {
val project = compilation.target.project
compilation.output.setResourcesDir(Callable { compilation.output.setResourcesDir(Callable {
val classesDirName = "resources/" + compilation.compilationName val classesDirName = "resources/" + compilation.compilationName
File(project.buildDir, classesDirName) File(project.buildDir, classesDirName)
@@ -141,7 +161,9 @@ open class KotlinTargetConfigurator(
resourcesTask.from(resourceSet) resourcesTask.from(resourceSet)
} }
private fun createLifecycleTask(compilation: KotlinCompilation, project: Project) { private fun createLifecycleTask(compilation: KotlinCompilation) {
val project = compilation.target.project
(compilation.output.classesDirs as ConfigurableFileCollection).from(project.files().builtBy(compilation.compileAllTaskName)) (compilation.output.classesDirs as ConfigurableFileCollection).from(project.files().builtBy(compilation.compileAllTaskName))
project.tasks.create(compilation.compileAllTaskName).apply { project.tasks.create(compilation.compileAllTaskName).apply {
@@ -157,7 +179,9 @@ open class KotlinTargetConfigurator(
} }
} }
private fun defineConfigurationsForTarget(project: Project, target: KotlinOnlyTarget<*>) { private fun defineConfigurationsForTarget(target: KotlinOnlyTarget<*>) {
val project = target.project
val configurations = project.configurations val configurations = project.configurations
val defaultConfiguration = configurations.maybeCreate(target.defaultConfigurationName) val defaultConfiguration = configurations.maybeCreate(target.defaultConfigurationName)
@@ -212,7 +236,8 @@ open class KotlinTargetConfigurator(
defaultConfiguration.extendsFrom(runtimeElementsConfiguration).usesPlatformOf(target) defaultConfiguration.extendsFrom(runtimeElementsConfiguration).usesPlatformOf(target)
} }
private fun configureBuild(project: Project, target: KotlinOnlyTarget<*>) { private fun configureBuild(target: KotlinOnlyTarget<*>) {
val project = target.project
val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME)
project.tasks.maybeCreate(buildNeededTaskName, DefaultTask::class.java).apply { project.tasks.maybeCreate(buildNeededTaskName, DefaultTask::class.java).apply {
description = "Assembles and tests this project and all projects it depends on." description = "Assembles and tests this project and all projects it depends on."
@@ -259,6 +284,8 @@ open class KotlinTargetConfigurator(
const val buildNeededTaskName = "buildAllNeeded" const val buildNeededTaskName = "buildAllNeeded"
const val buildDependentTaskName = "buildAllDependents" const val buildDependentTaskName = "buildAllDependents"
const val testTaskNameSuffix = "test"
fun defineConfigurationsForCompilation( fun defineConfigurationsForCompilation(
compilation: KotlinCompilation, compilation: KotlinCompilation,
target: KotlinTarget, target: KotlinTarget,
@@ -33,7 +33,7 @@ abstract class KotlinOnlyTargetPreset<T : KotlinCompilation>(
compilations = project.container(compilationFactory.itemClass, compilationFactory) compilations = project.container(compilationFactory.itemClass, compilationFactory)
} }
KotlinTargetConfigurator(buildOutputCleanupRegistry).configureTarget(project, result) KotlinTargetConfigurator(buildOutputCleanupRegistry).configureTarget(result)
result.compilations.all { compilation -> result.compilations.all { compilation ->
buildCompilationProcessor(compilation).run() buildCompilationProcessor(compilation).run()