自定义 active-flavor-specific gradle 任务包含在构建过​​程中

Custom active-flavor-specific gradle task included in build process

根据 Android Gradle 构建环境:

我目前通过 "readVersions" gradle 任务从本地 version.properties 文件读取我的版本代码和版本名称。我正在为我的应用程序添加口味。这些口味需要不同的版本。所以我想把两个不同的 version.properties 文件放在特定风味的目录(例如 one/version.properties,two/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
}

我想要一个包含 flavor 的新 readVersions 任务,以便我可以使用它来访问 "flavor" 目录中的 "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 文件有其他依赖性。我 可以 只在两个地方定义版本代码和版本名称(例如,在 "flavor" 内部以及风味的 version.properties 文件中,但是我 真的想要DRY配置)

我将 "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 的意见和建议。