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 中获取值的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 总是从任何任务中执行 println

AngularJS / JavaScript Splice - 总是从数组中删除第一个或最后一个项目

Gradle:如何构建不同构建类型的不同风格?

ListView 总是从 CustomAdaptor 中删除最后一行

Android 在代码中使用 Gradle Build 风格,例如 if 案例

为啥 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建?