Gradle环境变量.从文件加载

zwghvu4y  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(244)

我刚到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 Builder中使用。

环境文件

FOO_KEY=1234567

问:如何将env.file与Gradle environment一起使用来加载所有需要的env. params?

lkaoscv7

lkaoscv71#

那这个呢:

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

4uqofj5v2#

我也给予我的版本(检查如果行不是空的,不是一个注解,也不要覆盖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文件是很普遍的。

yebdmbv4

yebdmbv43#

下面的代码是我唯一能够生成的代码,它满足了在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")}\""
}

Kotlin:

Log.i(TAG, BuildConfig.ANDROID_APP_URL)

请让我知道你认为它作为我不完全确定它是如何工作的,特别是选择好的文件加载。

5lwkijsr

5lwkijsr4#

有一些插件可以从.env文件加载env变量(例如,one
因此,一个示例构建文件看起来如下所示(KotlinDSL)

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
}
mv1qrgav

mv1qrgav5#

我已经结束了在我的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
cyvaqqii

cyvaqqii6#

如果您正在使用Sping Boot bootRun任务或任何具有运行程序的任务

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

相关问题