自定义 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 的意见和建议。
根据 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 的意见和建议。