【问题标题】:Intellij - gradle refresh for android project that requires a parameterIntellij - 需要参数的android项目的gradle刷新
【发布时间】:2016-01-09 12:42:04
【问题描述】:

我有 gradle 项目,其 build.gradle 的简化 android 部分如下所示:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        def mapPlacesApiKeys = [dev_1: [api_key: 'key_1', sender_id: 'sender_id_1'], dev_9: [api_key: 'key_2', sender_id: 'sender_id_2'],prod_1: [api_key: 'key_3', sender_id: 'sender_id_3']]
        if (project.hasProperty('env')) {
            if (mapPlacesApiKeys.get(env) == null) {
                def keyset = mapPlacesApiKeys.keySet()
                throw new StopExecutionException("Value '$env' is not a valid environment value. Valid environments: $keyset. You can set an environment by passing the -Penv=<env> parameter to your gradle build.")
            }
        } 
        buildConfigField "String", "SENDER_ID", "\"${mapPlacesApiKeys.get(env).get('sender_id')}\""
        manifestPlaceholders = [maps_places_api_key: mapPlacesApiKeys.get(env).get('api_key')]
    }  
}

当我从命令行运行它时,我会使用环境参数运行它,例如-Penv=dev_1。正如您在脚本中看到的那样,这做了两件事: a) 将 androidmanifest 中的值“maps_places_api_key”替换为指定环境的实际键 b) 在 BuildConfig java 类中添加一个带有 SENDER_ID 的字符串。

这在命令行中可以正常工作。我的问题是,在 intellij(或 android studio,应该是相同的)中,当我导入 gradle 项目时,我收到以下错误:

-Penv is missing. You can set an environment by passing the -Penv=<env> parameter to your gradle build.

这是我要声明的例外情况。所以我的问题是如何构建这段代码,以便 IDE 在加载项目时不会尝试运行它。

请注意,我不想用任何类型的风味或 buildType 替换“env”参数,因为大约有 15 种不同的环境,这将是一团糟,但如果你想到另一个建议,感觉免费分享。

【问题讨论】:

  • 如果您希望IDE在加载项目时不尝试运行它,您希望IDE何时运行它?
  • 是的,我不太确定我有什么选择。我不介意它在尝试构建项目时是否会这样做(并且失败) - 至少我不会因为 gradle 一直不同步而收到垃圾邮件。另外,不应该有办法解决这个问题,以某种方式将参数传递给intellij,以便可以正确导入和构建该项目吗?我在 gradle 和 groovy 的构建配置选项卡中尝试了“脚本参数”,但它没有做任何事情。
  • 我认为你应该在 build.gradle 中添加一个包含这些代码的 gradle 任务,当你想使用时,在终端中运行任务。
  • 这就是我的想法,但我现在才开始使用 gradle,所以我不确定如何做到这一点。有没有办法从 android 标签之外的任务中使用“manifestPlaceholders”和“buildConfigField”?

标签: android android-studio intellij-idea gradle android-gradle-plugin


【解决方案1】:
android{   
    defaultConfig {
        applicationId 'com.xx'
        minSdkVersion 14
    } 
    productFlavors {
        def path="./channel.txt"
        file(path).eachLine { line->
            def words = line.split(':')
            def name = words[0]
            def sender_id = words[1]
            def api_key = words[2]
            "$name" {
                buildConfigField "String", "SENDER_ID", sender_id
                manifestPlaceholders = [maps_places_api_key: api_key]
            }
        }
    }
}

【讨论】:

  • 我最终为我的环境使用了默认值,因为我不想为我的不同环境引入所有这些风格。即使在我看来,这些口味也适用于不同版本的应用程序(例如付费/免费),而不仅仅是适用于不同的环境
  • 更新:我最终确实使用了这个!真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多