Gradle 总是从最后一种风格中的 buildType 中获取值
Posted
技术标签:
【中文标题】Gradle 总是从最后一种风格中的 buildType 中获取值【英文标题】:Gradle always take the values from the buildType inside the last flavor 【发布时间】:2018-07-03 12:00:34 【问题描述】:在我工作的公司,我们在内部和外部项目中使用了很多风格。另外还有 2 或 3 种构建类型(dev、prod 和 qa),有时我们需要更改风味内特定 buildType 上的特定变量。
这就是问题出现的地方,当我有不止一种风格时,Groovy 总是采用最后一个 buildType 的配置。
例子:
首先我定义了新的 buildTypes:
android
...
buildTypes
development
initWith debug
production
initWith release
...
然后我用特定的 buildType 更改定义风味:
productFlavors
mcDonalds
...
buildTypes
development
manifestPlaceholders = [onesignal_app_id : "4b77f560-26f3-420d-b438-d7aeb9912d4d",
onesignal_google_project_number: "REMOTE"]
production
manifestPlaceholders = [onesignal_app_id : "6b77f560-26f3-420d-b438-d7aeb9912d33",
onesignal_google_project_number: "REMOTE"]
burgerKing
...
buildTypes
development
manifestPlaceholders = [onesignal_app_id : "8b77f560-26f3-420d-b438-d7aeb9912d44",
onesignal_google_project_number: "REMOTE"]
production
manifestPlaceholders = [onesignal_app_id : "0b77f560-26f3-420d-b438-d7aeb9912456",
onesignal_google_project_number: "REMOTE"]
无论我选择构建哪种风味,gradle 将始终采用上一个风味的值,当我向麦当劳用户发送推送通知时,所有 burgerKing 用户都会收到有关巨无霸的广告。
Google told 这是有意的,如果我使用 build.gradle.ktl 就不会发生。我不明白他们怎么能说这是故意的。对我来说,这是一个 Groovy 问题,这是一个错误,越来越多的人在问题跟踪器上报告了相同的问题。
您建议哪种解决方法?
请不要建议我使用另一个维度,它不会起作用,因为每个风味/构建类型的配置都会发生变化,而且我认为构建变体的数量是荒谬的:
mcDonaldsDevelopmentDebug mcDonaldsDevelopmentRelease mcDonaldsProductionDebug mcDonaldsProductionRelease burgerKingDevelopmentDebug burgerKingDevelopmentRelease burgerKingProductionDebug burgerKingProductionRelease我只需要这样的东西:
麦当劳发展 麦当劳生产 burgerKing发展 burgerKingProduction【问题讨论】:
如果您尝试这种方法,是否会出现您发现的错误? ***.com/a/32503193/794088(还有,现在我饿了) 是的,有效。但有时我们对每种构建类型和风味组合都有很多配置,我们需要把所有东西都放在那里=\ 公平点,这种更简单的方法利用资源文件夹,并且有点符合您在清单中设置值的预期需求:***.com/a/36554080/794088 【参考方案1】:您可以采用以下解决方法:在构建时定义字符串值,您可以在代码的任何部分引用这些值。这是一个可以帮助您或其他任何人的示例
buildTypes
production
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
development
minifyEnabled false
productFlavors
mcDonalds
resValue "string", "key1", "value1"
resValue "string", "key2", "value2"
burgerKing
resValue "string", "key1", "value1"
resValue "string", "key2", "value2"
这将创建以下具有不同配置的构建变体
-
麦当劳发展
麦当劳生产
burgerKing发展
burgerKingProduction
您还可以在您的代码中检查您是否正在使用以下代码进行开发
if (BuildConfig.DEBUG)
//select string for development (key1)
else
//select string for production (key2)
【讨论】:
以上是关于Gradle 总是从最后一种风格中的 buildType 中获取值的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS / JavaScript Splice - 总是从数组中删除第一个或最后一个项目
ListView 总是从 CustomAdaptor 中删除最后一行