Gradle 环境变量.从文件加载



我是Gradle的新手。

目前我有这个任务:

task fooTask {
doLast {
exec {
environment 'FOO_KEY', '1234567' // Load from file here!
commandLine 'fooScript.sh'
}
}
}

fooScript.sh

#!/bin/bash
echo $FOO_KEY

一切都很好。但是我已经env.file了所有需要的环境变量。此文件在 Docker 生成器中使用。

环境文件管理器

FOO_KEY=1234567

问题:如何将env.file与 Gradleenvironment一起使用来加载所有需要的环境参数?

这个呢:

task fooTask {
doLast {
exec {
file('env.file').readLines().each() {
def (key, value) = it.tokenize('=')
environment key, value
}
commandLine 'fooScript.sh'
}
}
}

我也给出了我的版本(检查行是否不为空而不是注释,也不要覆盖env var(:

file('.env').readLines().each() {
if (!it.isEmpty() && !it.startsWith("#")) {
def pos = it.indexOf("=")
def key = it.substring(0, pos)
def value = it.substring(pos + 1)
if (System.getenv(key) == null) {
environment key, value
}
}
}

但实际上,我认为他们应该将此功能添加为 exec 插件属性!现在使用.env文件很常见。

以下代码是我唯一能够生成的代码,它满足在 Android studio 中提供高效的"UNIX 标准环境文件导入"的两个最重要的要求:

  • 加载一个依赖于构建类型的文件(至少:调试和发布(
  • 在 Android 代码中公开指定的环境变量,实际上不是作为环境变量,而是作为 buildConfigFields 内容。
ext {
node_env = ""
}
android.applicationVariants.all { variant ->
if (variant.name == "debug") {
project.ext.set("node_env", "development")
} else if (variant.name == "release") {
project.ext.set("node_env", "production")
}
file("." + node_env + '.env').readLines().each() {
if (!it.isEmpty() && !it.startsWith("#")) {
def pos = it.indexOf("=")
def key = it.substring(0, pos)
def value = it.substring(pos + 1)
if (System.getProperty(key) == null) {
System.setProperty("env.$key", value)
}
}
}
if (variant.name == "release") {
android.signingConfigs.release.storeFile file(System.getProperty("env.ANDROID_APP_SIGNING_STOREFILE"))
android.signingConfigs.release.keyAlias System.getProperty("env.ANDROID_APP_SIGNING_KEYALIAS")
android.signingConfigs.release.storePassword System.getProperty("env.ANDROID_APP_SIGNING_STOREPASSWORD")
android.signingConfigs.release.keyPassword System.getProperty("env.ANDROID_APP_SIGNING_KEYPASSWORD")
}
android.defaultConfig.buildConfigField "String", "ANDROID_APP_URL", ""${System.getProperty("env.ANDROID_APP_URL")}""
}

科特林 :

Log.i(TAG, BuildConfig.ANDROID_APP_URL)

请让我知道你对它的看法,因为我不完全确定它是如何工作的,尤其是选择要加载的好文件。

有一些插件可以从 .env 文件加载 env vars(例如这个(

所以一个示例构建文件将看起来像这样(Kotlin DSL(


plugins {
id("co.uzzu.dotenv.gradle") version "1.1.0"
}
tasks.withType<Test> {
useJUnitPlatform()
//will pass the env vars loaded by the plugin to the environment of the tests
environment = env.allVariables
}

我最终在我的 gradlew 文件中这样做了。一个可能的缺点是,在升级到 gradle 时,更改往往会被覆盖。

# Hack: export all variables in the .env file
#
ENV_FILE=../../.env
if [ ! -f $ENV_FILE ];then
echo "WARNING/DEV ENV Missing a ${ENV_FILE} file with environment variables (secrets)";
fi
for secret in `cat $ENV_FILE`;do export $secret;done

如果您使用的是 Spring BootbootRun任务或任何带有运行器的任务

tasks.named('bootRun') {
doFirst {
file('.env').readLines().each() {
def (key, value) = it.tokenize('=')
environment key, value
}
}
}

最新更新