gradle / kotlin-dsl-samples

Samples builds using the Gradle Kotlin DSL
https://gradle.org/kotlin/
Other
3.71k stars 434 forks source link

Defining properties per Android product flavors override themself #1254

Closed Syex closed 5 years ago

Syex commented 6 years ago

Hey,

I'm currently converting our Android build file from Groovy to Kotlin DSL, so far everything worked very well 👍 However, I'm struggling with defining properties per product flavor for Fabric.

This is the old (shortened) Groovy code:

productFlavors {
        dev {
            ext.betaDistributionGroupAliasesFilePath = file('fabric/distrGroup_devs.txt').path
        }

        release {
            ext.betaDistributionGroupAliasesFilePath = file('fabric/distrGroup_external.txt').path
        }
}

where the property would change depending on the variant I'm currently building.

I changed it like this:

productFlavors {
        register("dev") {
            ext["betaDistributionGroupAliasesFilePath"] = file("fabric/distrGroup_devs.txt'").path
        }

        register("release") {
            ext["betaDistributionGroupAliasesFilePath"] = file("fabric/distrGroup_external.txt").path
        }
}

Now, always the last assigned value is used, so release is always overriding dev. I also tried:

productFlavors {
        register("dev") {
            crashlytics {
                betaDistributionGroupAliasesFilePath = file("fabric/distrGroup_devs.txt'").path
            }
        }

        register("release") {
            crashlytics {
                betaDistributionGroupAliasesFilePath = file("fabric/distrGroup_external.txt").path
            }
        }
}

or extra["betaDistributionGroupAliasesFilePath"] but I always get the same output, that the last assigned value is used.

It seems in Groovy ext was per flavor while with Kotlin DSL ext is set per project, so it overrides the value.

Am I misunderstanding something? Is it a bug?

Kotlin 1.3.10 Gradle 4.10

eskatos commented 5 years ago

This is because the Android type for product flavor doesn't declare that it is ExtensionAware. The closer ExtensionAware type in that scope is the Project, hence the properties going to the project.

As a workaround you can do:

productFlavors {
        register("dev") {
            require(this is ExtensionAware)
            extra["betaDistributionGroupAliasesFilePath"] = file("fabric/distrGroup_devs.txt'").path
        }

        register("release") {
            require(this is ExtensionAware)
            extra["betaDistributionGroupAliasesFilePath"] = file("fabric/distrGroup_external.txt").path
        }
}