我是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
}
}
}