【问题标题】:Custom active-flavor-specific gradle task included in build process构建过程中包含的自定义 active-flavor-specific gradle 任务
【发布时间】:2016-04-01 21:14:27
【问题描述】:

每个 Android Gradle 构建环境:

我目前通过“readVersions”gradle 任务从本地 version.properties 文件中读取了我的版本代码和版本名称。我正在为我的应用程序添加风味。这些口味需要不同的版本。所以我想在风味特定的“res”和“src”目录旁边放置两个不同的 version.properties 文件。

我有一个 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配置)

【问题讨论】:

  • 没有“活跃的味道”。您的 build.gradle 文件不会构建您的应用程序。您的build.gradle 文件构建了一个如何 构建应用程序的对象模型。从对象模型构建工作。对于这两种风味,您都需要dependsOn,其中适当的风味特定任务取决于您自定义的风味特定任务。
  • 是的,我明白这一点。这就是为什么我试图在我的“概念上”描述中强调那部分。你明白我想要做什么吗?你知道如何建立一个对象模型来实现我想要做的事情吗?如果没有,我可以尝试进一步定义我的目标。
  • 我很犹豫是否要为风味创建一堆自定义“dependsOn”,其中适当的风味特定任务取决于您自定义的风味特定任务。如果我最终有 10 或 20 种口味怎么办?我只想从 ${flavor.name}/version.properties 文件中获取本地版本代码/名称。我真的需要 20 个自定义任务来实现这一点吗?
  • “我真的需要 20 个自定义任务来实现这个吗?” - 是的。不过,您不一定需要 20 个手动生成的自定义任务来实现这一点。您似乎与productFlavors.all 走在了正确的轨道上,尽管我认为可能需要buildVariants.all。但是随后您开始谈论“主动风味的任务”并偏离轨道。在您的循环中,获取您要说的特定于风味的任务取决于这个新生成的任务。我在this build.gradle file 中做了一些类似的事情。
  • 现在,我的情况稍微简单一些,因为我只是根据Jar 任务配置任务实例,而不是用整块布料制作东西。这就是我发布 cmets 的原因,因为我没有完整的答案给你。也许解决方案是为您定义一个处理任意风味的“通用”任务,然后在循环中设置该通用任务的风味特定实例并设置dependsOn

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


【解决方案1】:

我将“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”。我的任务没有从正确的风格设置它,这就是为什么我想出了另一个解决方案,但在设置后阅读它总是“空”。

感谢 CommonsWare 的 cmets 和建议。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多