【发布时间】: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。但是随后您开始谈论“主动风味的任务”并偏离轨道。在您的循环中,获取您要说的特定于风味的任务取决于这个新生成的任务。我在thisbuild.gradlefile 中做了一些类似的事情。 -
现在,我的情况稍微简单一些,因为我只是根据
Jar任务配置任务实例,而不是用整块布料制作东西。这就是我发布 cmets 的原因,因为我没有完整的答案给你。也许解决方案是为您定义一个处理任意风味的“通用”任务,然后在循环中设置该通用任务的风味特定实例并设置dependsOn。
标签: android gradle build.gradle android-productflavors gradle-task