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

use*_*111 41 environment-variables gradle build.gradle

我正在尝试从Gradle构建中设置环境变量.我在MacOS X(El Capitan)上.该命令是"gradle test".

我在build.gradle中尝试这个:

task setenv(type: Exec) {
    commandLine "export", "SOME_TEST_VAR=aaa"
}
test.dependsOn setenv
Run Code Online (Sandbox Code Playgroud)

并且构建失败:

任务':myproject:setenv'的执行失败.

启动进程'命令'导出'出现问题''

我也试过这个:

test.doFirst {
    ProcessBuilder pb1 = new ProcessBuilder("export SOME_TEST_VAR=some test value")
    pb1.start();
}
Run Code Online (Sandbox Code Playgroud)

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

assertTrue(System.getenv().containsKey("SOME_TEST_VAR"));
Run Code Online (Sandbox Code Playgroud)

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

更新:

我已经单独测试了它:值传递了,我的测试任务收到了所有东西,无论是systemProperty,环境变量还是jvmArgs.

所以,Gradle本身并没有错.

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

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

Ort*_*kni 46

对于测试任务,您可以使用如下环境属性:

test {
  environment "VAR", "val"
}
Run Code Online (Sandbox Code Playgroud)

您还可以在exec任务中使用environment属性

task dropDatabase(type: Exec) {
    environment "VAR", "val"
    commandLine "doit"
}
Run Code Online (Sandbox Code Playgroud)

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

  • "test"任务忽略"environment","jvmArgs"和"systemProperties"之类的东西.我拼命想要理解为什么.我知道在一个单独的JVM中运行测试 - 然后至少"jvmArgs"应该可以工作,但事实并非如此. (7认同)

Ale*_*hin 8

如果您使用 Gradle Kotlin 语法,您还可以执行以下操作:

tasks.taskName {
    environment(mapOf("A" to 1, "B" to "C"))
}
Run Code Online (Sandbox Code Playgroud)

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

tasks.test {
    environment(mapOf("SOME_TEST_VAR" to "aaa"))
}
Run Code Online (Sandbox Code Playgroud)


Gui*_*n70 7

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

run.doFirst { environment 'SPARK_LOCAL_IP', 'localhost' }
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于所有任务:`Could not find method environment() for arguments ...` (7认同)