构建过程中包含自定义的特定于活动风格的gradle任务

时间:2016-04-01 21:14:28

标签: android gradle build.gradle android-productflavors gradle-task

根据Android Gradle构建环境:

我目前通过" readVersions"从本地version.properties文件中读取我的版本代码和版本名称。 gradle任务。我正在为我的应用添加口味。这些口味需要不同的版本。所以我想在风味特定目录(例如一个/ version.properties,两个/ version.properties)中放置两个不同的version.properties文件,这些文件位于特定风格的" res"和" src"目录。

我有一个readVersions任务:

task readVersions() {
    def Properties versionProps = new Properties()
    def versionPropsFile = file('version.properties')
    if (versionPropsFile.exists())
        versionProps.load(new FileInputStream(versionPropsFile))
    def v_code = (versionProps['VERSION_CODE'] ?: "0").toInteger()
    def v_name = versionProps['VERSION_NAME']

    // Set
    versionCode v_code
    versionName v_name
}

project.afterEvaluate {
    preBuild.dependsOn readVersions
}

我想有一个新的readVersions任务,它包含了这个味道,以便我可以用它来访问" version.properties"文件内的" flavor" 。目录

我试过了:

android.productFlavors.all{ flavor ->
    task ("${flavor.name}_readVersions")<<{
    def versionPropsFile = file(flavor.name+'/version.properties')
...

然而,我不知道如何在&#34; preBuild&#34;期间运行活动风味的任务?步。

从概念上讲我想要这个:

project.afterEvaluate {
    preBuild.dependsOn ${active_flavor}_readVersions
}

向那些建议重组并找到更简单的解决方案的人。我的构建过程当前对这些version.properties文件有其他依赖性。我可以只在两个地方定义版本代码和版本名称(例如在&#34; flavor&#34;以及在flavor的版本.properties文件中,但我< em>真的想要DRY配置)

1 个答案:

答案 0 :(得分:0)

I split my "readVersions" task into "readVersionName" and "readVersionCode"

def getVersionName(flavor) {
    return getVersion(flavor, "VERSION_NAME", false)
}
def getVersionCode(flavor) {
    return getVersion(flavor, "VERSION_CODE", true)
}
def getVersion(flavor, type, intRequired) {
    // READ
    def Properties versionProps = new Properties()
    def versionPropsFile = file("${flavor}/version.properties")
    if (versionPropsFile.exists())
        versionProps.load(new FileInputStream(versionPropsFile))
    def value = versionProps["${type}"]
    return intRequired ? value.toInteger() : value
}

Then I run them inside each flavor's definition:

productFlavors {
    one {
        versionName getVersionName("one")
        versionCode getVersionCode("one")
    }
    two {
        versionName getVersionName("two")
        versionCode getVersionCode("two")
    }

One thing to note, my previous attempt was trying to incorporate the versionName and versionCode setting into dependencies on the preBuild task. It seems like by this time in the process, 'versionName' can no longer be set properly. My tasks were not setting it from the correct flavor, which is why I came up with another solution, but reading it after setting it was always 'null'.

Thank you CommonsWare for the comments and suggestions.

相关问题