如何在.yaml和.gradle文件之间共享变量?

时间:2018-04-16 07:58:58

标签: android git gradle intellij-idea yaml

我正在git服务器中开发支持CI(持续集成)的Android库。配置使用.yaml.yml文件。我使用的构建系统是Android Studio的默认构建系统,它是gradle,所以我也在这里使用.gradle配置文件。我的问题是,如何在这些文件之间共享变量?因为我需要升级每个文件中实际相同的变量,例如ANDROID_API_LEVELANDROID_BUILD_TOOLS_VERSION等。如果我应该编辑每个文件以升级版本将是不方便的。 我可以使用哪种最佳做法?

例如,这是我的yaml文件看起来像

language: android
sudo: false
dist: precise

env:
  global:
   - ANDROID_API_LEVEL=27
   - ANDROID_EMULATOR_API_LEVEL=21
   - ANDROID_BUILD_TOOLS_VERSION=27.0.3
   - ANDROID_ABI=armeabi-v7a
...

这是我的项目级gradle文件,如

buildscript {
    ext {
        kotlinVersion = '1.2.31'
        ankoVersion = "0.10.2"
        compileSdkVersion = 27
        buildToolsVersion = "27.0.3"
        minSdkVersion = 14
        targetSdkVersion = 27
        androidSupportVersion = "27.1.1"
    }
...

我想说我想在ANDROID_BUILD_TOOLS_VERSION文件中与yaml文件中的buildToolsVersion分享变量gradle的值。

1 个答案:

答案 0 :(得分:0)

您可以使用SnakeYAML从YAML文件中读取和写入属性。

看看this回答,他们谈论同样的问题。

使用示例更新答案

实现完全相同,因为Android Studio和Spring(在本例中)都使用Gradle作为主要的执行buildtool。我共享的链接显示了如何在build.gradle中访问YAML属性的基本原则,并且是作为一个如何开始的。

这会将build.gradle文件的选定env.global属性与YAML文件同步。像languagesudodist这样的琐碎属性不受此操作的影响。在这种情况下要维护的主文件是build.gradle文件,因为YAML文件将由Gradle维护。

我写了一篇关于如何实现这个目标的简短片段:

档案: cfg.yaml

language: android
sudo: false
dist: precise
env:
  global:
  - ANDROID_API_LEVEL=27
  - ANDROID_EMULATOR_API_LEVEL=21
  - ANDROID_BUILD_TOOLS_VERSION=27.0.3
  - ANDROID_ABI=armeabi-v7a

文件: build.gradle

import org.yaml.snakeyaml.DumperOptions
import org.yaml.snakeyaml.Yaml

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.yaml', name: 'snakeyaml', version: '1.21'
    }
}

ext {
    buildToolsVersion = '27.202'
}

task updateYAMLFile() {
    def configurationYAML = "cfg.yaml"

    inputs.files buildscript.sourceFile
    outputs.files configurationYAML

    DumperOptions options = new DumperOptions()
    options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK)
    options.setPrettyFlow(true)
    Yaml yaml = new Yaml(options)

    ext {
        updateGlobalProperties = { cfg, name, version ->
            def index = (int) cfg.env.global.findIndexValues { it ==~ /$name.*/ }[0]
            cfg.env.global.set(index, name + '=' + version)
        }
    }

     doLast {
        def cfg = yaml.load(new File(configurationYAML).newInputStream())
        updateGlobalProperties(cfg, 'ANDROID_BUILD_TOOLS_VERSION', buildToolsVersion)

        FileWriter writer = new FileWriter(configurationYAML)
        yaml.dump(cfg, writer)
    }
}