我正在git服务器中开发支持CI(持续集成)的Android库。配置使用.yaml
或.yml
文件。我使用的构建系统是Android Studio的默认构建系统,它是gradle,所以我也在这里使用.gradle
配置文件。我的问题是,如何在这些文件之间共享变量?因为我需要升级每个文件中实际相同的变量,例如ANDROID_API_LEVEL
,ANDROID_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
的值。
答案 0 :(得分:0)
您可以使用SnakeYAML从YAML文件中读取和写入属性。
看看this回答,他们谈论同样的问题。
使用示例更新答案
实现完全相同,因为Android Studio和Spring(在本例中)都使用Gradle作为主要的执行buildtool。我共享的链接显示了如何在build.gradle中访问YAML属性的基本原则,并且是作为一个如何开始的。
这会将build.gradle文件的选定env.global
属性与YAML文件同步。像language
,sudo
和dist
这样的琐碎属性不受此操作的影响。在这种情况下要维护的主文件是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)
}
}