1

每个 Android Gradle 构建环境:

我目前通过“readVersions”gradle 任务从本地 version.properties 文件中读取我的版本代码和版本名称。我正在为我的应用程序添加风味。这些口味需要不同的版本。所以我正在考虑将两个不同的 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”文件。

我努力了:

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

但是我不知道如何在“preBuild”步骤中 只让活动风味的任务运行。

从概念上讲,我想要这个:

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

对于那些建议重组和寻找更简单解决方案的人。我的构建过程目前对这些 version.properties 文件有其他依赖项。我可以在两个地方定义版本代码和版本名称(例如在“风味”以及风味的 version.properties 文件中,但我真的想要 DRY 配置)

4

1 回答 1

0

我将“readVersions”任务拆分为“readVersionName”和“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
}

然后我在每个风味的定义中运行它们:

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

需要注意的一点是,我之前的尝试是尝试将 versionName 和 versionCode 设置合并到 preBuild 任务的依赖项中。在这个过程中,似乎无法再正确设置“versionName”。我的任务没有从正确的风格设置它,这就是为什么我想出了另一个解决方案,但是在设置它之后阅读它总是'null'。

感谢 CommonsWare 的意见和建议。

于 2016-04-04T18:19:38.237 回答