From 7ef80787dde1895da7f550fb00169434a57ef7bb Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Sat, 21 May 2016 09:30:14 -0700 Subject: [PATCH] Dependencies for variants. Fixes https://github.com/cbeust/kobalt/issues/204 --- .../kotlin/com/beust/kobalt/JarGenerator.kt | 6 ++- .../main/kotlin/com/beust/kobalt/Variant.kt | 2 +- .../com/beust/kobalt/api/BuildTypeConfig.kt | 19 ++++++++ .../com/beust/kobalt/api/DependencyHolder.kt | 38 +++++++++++++++ .../beust/kobalt/api/ProductFlavorConfig.kt | 17 +++++++ .../kotlin/com/beust/kobalt/api/Project.kt | 47 +------------------ .../beust/kobalt/maven/DependencyManager.kt | 7 ++- 7 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/BuildTypeConfig.kt create mode 100644 modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/DependencyHolder.kt create mode 100644 modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ProductFlavorConfig.kt diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt index 432039ea..d7197526 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt @@ -99,7 +99,11 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) @Suppress("UNCHECKED_CAST") val dependentProjects = project.projectProperties.get(JvmCompilerPlugin.DEPENDENT_PROJECTS) as List - val allDependencies = project.compileDependencies + project.compileRuntimeDependencies + val allDependencies = project.compileDependencies + project.compileRuntimeDependencies + + context.variant.buildType.compileDependencies + + context.variant.buildType.compileRuntimeDependencies + + context.variant.productFlavor.compileDependencies + + context.variant.productFlavor.compileRuntimeDependencies val transitiveDependencies = dependencyManager.calculateDependencies(project, context, dependentProjects, allDependencies) transitiveDependencies.map { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt index d9752f66..f4002c36 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/Variant.kt @@ -188,7 +188,7 @@ class Variant(val initialProductFlavor: ProductFlavorConfig? = null, override fun toString() = toTask("") companion object { - val DEFAULT_PRODUCT_FLAVOR = ProductFlavorConfig("") + val DEFAULT_PRODUCT_FLAVOR = ProductFlavorConfig(null, "") val DEFAULT_BUILD_TYPE = BuildTypeConfig(null, "") fun allVariants(project: Project): List { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/BuildTypeConfig.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/BuildTypeConfig.kt new file mode 100644 index 00000000..7d627fd5 --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/BuildTypeConfig.kt @@ -0,0 +1,19 @@ +package com.beust.kobalt.api + +import com.beust.kobalt.api.annotation.Directive + +class BuildTypeConfig(val project: Project?, val name: String) : IBuildConfig, + IDependencyHolder by DependencyHolder(project) { + var minifyEnabled = false + var applicationIdSuffix: String? = null + var proguardFile: String? = null + + override var buildConfig : BuildConfig? = BuildConfig() +} + +@Directive +fun Project.buildType(name: String, init: BuildTypeConfig.() -> Unit) = BuildTypeConfig(this, name).apply { + init() + addBuildType(name, this) +} + diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/DependencyHolder.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/DependencyHolder.kt new file mode 100644 index 00000000..f958d66b --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/DependencyHolder.kt @@ -0,0 +1,38 @@ +package com.beust.kobalt.api + +import com.beust.kobalt.api.annotation.Directive +import java.util.* + +/** + * Various elements in a build file let you specify dependencies: projects, buildType and productFlavor. + * They all implement this interface and delegate to an instance of the concrete class below. + */ +interface IDependencyHolder { + val compileDependencies : ArrayList + val compileProvidedDependencies : ArrayList + val compileRuntimeDependencies : ArrayList + val excludedDependencies : ArrayList + + @Directive + var dependencies: Dependencies? + + @Directive + fun dependencies(init: Dependencies.() -> Unit) : Dependencies +} + +open class DependencyHolder(val project: Project?) : IDependencyHolder { + override val compileDependencies : ArrayList = arrayListOf() + override val compileProvidedDependencies : ArrayList = arrayListOf() + override val compileRuntimeDependencies : ArrayList = arrayListOf() + override val excludedDependencies : ArrayList = arrayListOf() + + override var dependencies : Dependencies? = null + + override fun dependencies(init: Dependencies.() -> Unit) : Dependencies { + dependencies = Dependencies(project!!, compileDependencies, compileProvidedDependencies, + compileRuntimeDependencies, excludedDependencies) + dependencies!!.init() + return dependencies!! + } +} + diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ProductFlavorConfig.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ProductFlavorConfig.kt new file mode 100644 index 00000000..01877889 --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/ProductFlavorConfig.kt @@ -0,0 +1,17 @@ +package com.beust.kobalt.api + +import com.beust.kobalt.api.annotation.Directive + +class ProductFlavorConfig(val project: Project?, val name: String) : IBuildConfig, + IDependencyHolder by DependencyHolder(project) { + var applicationId: String? = null + override var buildConfig : BuildConfig? = BuildConfig() +} + +@Directive +fun Project.productFlavor(name: String, init: ProductFlavorConfig.() -> Unit) = ProductFlavorConfig(this, name).apply { + init() + addProductFlavor(name, this) +} + + diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt index bf4a732b..d42ee5df 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/Project.kt @@ -18,12 +18,12 @@ open class Project( @Directive open var group: String? = null, @Directive open var artifactId: String? = null, @Directive open var packaging: String? = null, - @Directive open var dependencies: Dependencies? = null, @Directive open var description : String = "", @Directive open var scm : Scm? = null, @Directive open var url: String? = null, @Directive open var licenses: List = arrayListOf(), - @Directive open var packageName: String? = group) : IBuildConfig { + @Directive open var packageName: String? = group) + : IBuildConfig, IDependencyHolder by DependencyHolder(null) { class ProjectExtra(project: Project) { val dependsOn = arrayListOf() @@ -83,19 +83,6 @@ open class Project( // Dependencies // - @Directive - fun dependencies(init: Dependencies.() -> Unit) : Dependencies { - dependencies = Dependencies(this, compileDependencies, compileProvidedDependencies, - compileRuntimeDependencies, excludedDependencies) - dependencies!!.init() - return dependencies!! - } - - val compileDependencies : ArrayList = arrayListOf() - val compileProvidedDependencies : ArrayList = arrayListOf() - val compileRuntimeDependencies : ArrayList = arrayListOf() - val excludedDependencies : ArrayList = arrayListOf() - @Directive fun dependenciesTest(init: Dependencies.() -> Unit) : Dependencies { dependencies = Dependencies(this, testDependencies, testProvidedDependencies, compileRuntimeDependencies, @@ -208,36 +195,6 @@ interface IBuildConfig { } } -class ProductFlavorConfig(val name: String) : IBuildConfig { - var applicationId: String? = null - override var buildConfig : BuildConfig? = BuildConfig() -} - -@Directive -fun Project.productFlavor(name: String, init: ProductFlavorConfig.() -> Unit) = ProductFlavorConfig(name).apply { - init() - addProductFlavor(name, this) - } - -class BuildTypeConfig(val project: Project?, val name: String) : IBuildConfig { - var minifyEnabled = false - var applicationIdSuffix: String? = null - var proguardFile: String? = null - -// fun getDefaultProguardFile(name: String) : String { -// val androidPlugin = Plugins.findPlugin(AndroidPlugin.PLUGIN_NAME) as AndroidPlugin -// return Proguard(androidPlugin.androidHome(project)).getDefaultProguardFile(name) -// } - - override var buildConfig : BuildConfig? = BuildConfig() -} - -@Directive -fun Project.buildType(name: String, init: BuildTypeConfig.() -> Unit) = BuildTypeConfig(this, name).apply { - init() - addBuildType(name, this) - } - fun Project.defaultConfig(init: BuildConfig.() -> Unit) = let { project -> BuildConfig().apply { init() diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt index c3444162..f92fa8db 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/DependencyManager.kt @@ -191,7 +191,12 @@ class DependencyManager @Inject constructor(val executors: KobaltExecutors, val val transitive = hashSetOf() val projects = listOf(ProjectDescription(project, project.projectExtra.dependsOn)) with(project) { - val deps = arrayListOf(compileDependencies, compileProvidedDependencies) + val deps = arrayListOf(compileDependencies, compileProvidedDependencies, + context.variant.buildType.compileDependencies, + context.variant.buildType.compileProvidedDependencies, + context.variant.productFlavor.compileDependencies, + context.variant.productFlavor.compileProvidedDependencies + ) if (isTest) { deps.add(testDependencies) deps.add(testProvidedDependencies)