如何从 Gradle 构建中设置环境变量?

Posted

技术标签:

【中文标题】如何从 Gradle 构建中设置环境变量?【英文标题】:How to set an environment variable from a Gradle build? 【发布时间】:2016-07-19 06:22:21 【问题描述】:

我正在尝试从我的 Gradle 构建中设置一个环境变量。我在 MacOS X (El Capitan) 上。 命令是“gradle test”。

我正在我的 build.gradle 中尝试这个:

task setenv(type: Exec) 
    commandLine "export", "SOME_TEST_VAR=aaa"

test.dependsOn setenv

构建失败:

任务 ':myproject:setenv' 执行失败。

启动进程'command 'export''时出现问题

我也试过这个:

test.doFirst 
    ProcessBuilder pb1 = new ProcessBuilder("export SOME_TEST_VAR=some test value")
    pb1.start();

构建成功。但是,如果我在 JUnit 测试中检查环境变量,它会失败:

assertTrue(System.getenv().containsKey("SOME_TEST_VAR"));

有没有办法从 Gradle 构建(在 build.gradle 文件中)设置环境变量?

更新:

我已经单独对其进行了测试:值确实通过了,并且我的测试任务接收了所有内容,无论是 systemProperty、环境变量还是 jvmArgs。

所以,这里的 Gradle 本身并没有什么问题。

当我在实际项目中尝试时,问题就出现了。它使用 Spring 进行依赖注入。我可能错了,但看起来 Spring 框架在某处清除了这些值。

该子项目目前被冻结,我现在无法详细检查我的猜测。

【问题讨论】:

另一个失败的实验:test systemProperty 'SOME_TEST_VAR', 'aaa' environment 'SOME_TEST_VAR', 'aaa' 并在测试中:boolean good = System.getenv().containsKey("SOME_TEST_VAR") || System.getProperties().containsKey("SOME_TEST_VAR"); assertTrue(good); 即使在阅读了帮助之后,我也无法在此处设置换行符。抱歉,请假设我打算在哪里制作它们。 如果您需要提供更多信息,您应该编辑您的问题。 更新了问题。问题不在于 Gradle。 【参考方案1】:

对于测试任务,您可以像这样使用environment property:

test 
  environment "VAR", "val"

你也可以在执行任务中使用environment property

task dropDatabase(type: Exec) 
    environment "VAR", "val"
    commandLine "doit"

请注意,使用此方法,环境变量仅在任务期间设置。

【讨论】:

对于“测试”任务,“环境”、“jvmArgs”和“systemProperties”之类的内容将被忽略。我拼命地试图理解为什么。我知道在单独的 JVM 中运行的测试——那么至少“jvmArgs”应该可以工作,但它不能。 如果你只想 fork JVM,也可以使用 JavaExec 类。 如何将其用于创意任务。可以很好地完成测试任务,但不能正常工作。请建议最好的方法。 @Aditchoudhary,您应该首先将测试运行委托给 Gradle。您可以在此处查看如何委派它 - mrhaki.blogspot.com/2016/11/… 有时你只是找到你正在寻找的东西......【参考方案2】:

您还可以使用“环境”命令“预先”设置环境变量:

run.doFirst  environment 'SPARK_LOCAL_IP', 'localhost' 

【讨论】:

这不适用于所有任务:Could not find method environment() for arguments ... 这对我有用!当我从 Gradle 运行服务器时,我只想设置环境变量,这很有效。谢谢! 如果遇到Could not find method environment() 错误,请确保键和值之间有逗号(,):environment "KEY", "VALUE"【参考方案3】:

如果您在 Gradle 外部定义了全局环境变量,

test 
    environment "ENV_VAR",  System.getenv('ENV_VAR')
    useJUnitPlatform()

【讨论】:

【参考方案4】:

这看起来像一个旧线程,但我们可以在 Gradle 任务中设置环境变量的另一种变体。

task runSomeRandomTask(type: NpmTask, dependsOn: [npmInstall]) 
    environment = [ 'NODE_ENV': 'development', BASE_URL: '3000' ]
    args = ['run']

上述 Gradle 任务集成了 Gradle 和 npm 任务。

这样我们可以传递多个环境变量。希望这有助于扩大上述答案已经提供的理解。干杯!!

【讨论】:

【参考方案5】:

这个对我有用,用于设置测试插件的环境变量

test 
    systemProperties = [
        'catalina.home': 'c:/test'
    ]
    println "Starting Tests"
    beforeTest  descriptor ->
       logger.lifecycle("Running test: " + descriptor)                
        

【讨论】:

不过,systemProperty 与环境变量不是一回事,对吧?【参考方案6】:

如果您使用 Gradle Kotlin 语法,您也可以这样做:

tasks.taskName 
    environment(mapOf("A" to 1, "B" to "C"))

所以对于test 任务,这将是:

tasks.test 
    environment(mapOf("SOME_TEST_VAR" to "aaa"))

【讨论】:

【参考方案7】:

如果您使用的是 IDE,请前往运行、编辑配置、gradle、 选择 gradle 任务并更新环境变量。见下图。

或者,如果您使用终端执行 gradle 命令, 只需输入“export KEY=VALUE”,您的工作就完成了。

【讨论】:

【参考方案8】:

请试试这个选项:

 task RunTest(type: Test) 
         systemProperty "spring.profiles.active", System.getProperty("DEV")
         include 'com/db/project/Test1.class'
     

【讨论】:

【参考方案9】:

需要环境变量来自定义 gradle 任务的执行。 下面是 gradle 7.3.2 中的工作代码,需要将主机和端口传递给黄瓜步骤。

    task runFunctionalTests() 
    dependsOn assemble, testClasses
    doLast 
        javaexec 
            mainClass = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = [
                    '--glue', 'com.examples.functional.steps',
               'src/test/java/com/examples/tests/functional/features'
            ]
            environment 'PROTOCOL', 'http'
            environment "HOST", "myserver"
            environment 'PORT', '8080'
        
    

然后您在黄瓜步骤中访问环境变量,如下所示

String host = System.getenv("HOST");
int port = Integer.parseInt(System.getenv("PORT"));
String host = System.getenv("PROTOCOL");

【讨论】:

【参考方案10】:

在我的项目中,我在子模块中有用于集成测试的 Gradle 任务:

task intTest(type: Test) 
...
system.properties System.properties 
...

这是将所有系统参数注入测试环境的要点。 所以,现在你可以像这样运行 gradle 来传递带有 ABC 值的参数,并在你的代码中通过 $param 使用它的值

gradle :some-service:intTest -Dparam=ABC

【讨论】:

以上是关于如何从 Gradle 构建中设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在build.gradle中创建文件并设置环境变量并获取文件内的数据?

BuildConfig 无法从变量中正确创建值(Gradle Android)

从 gradle 构建脚本中读取 heroku 环境变量

如何通过任务设置gradle这个环境变量?

在 gradle-pitest-plugin 中设置环境变量

Gradle 实战—— 配置环境变量