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

如何从Gradle构建中设置环境变量?,gradle,environment-variables,build.gradle,Gradle,Environment Variables,Build.gradle,我正在尝试从Gradle构建中设置一个环境变量。我在MacOS X(El Capitan)上。 命令是“梯度测试” 我试着在我的身体里这样做。格雷德尔: task setenv(type: Exec) { commandLine "export", "SOME_TEST_VAR=aaa" } test.dependsOn setenv 而构建失败: 任务“:myproject:setenv”的执行失败 启动进程“命令”导出“”时出现问题 我也试过: test.doFirst {

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

我试着在我的身体里这样做。格雷德尔:

task setenv(type: Exec) {
    commandLine "export", "SOME_TEST_VAR=aaa"
}
test.dependsOn setenv
而构建失败:

任务“:myproject:setenv”的执行失败

启动进程“命令”导出“”时出现问题

我也试过:

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、环境变量还是JVMARG

所以Gradle本身在这里没什么问题

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


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

对于测试任务,您可以使用如下方法:

test {
  environment "VAR", "val"
}
也可以在exec任务中使用

task dropDatabase(type: Exec) {
    environment "VAR", "val"
    commandLine "doit"
}
请注意,使用此方法,环境变量仅在任务期间设置。

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

run.doFirst { environment 'SPARK_LOCAL_IP', 'localhost' }

这是一个为我工作的设置环境变量的测试插件

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

在我的项目中,我有子模块集成测试的梯度任务:

task intTest(type: Test) {
...
system.properties System.properties 
...
这是将所有系统参数注入测试环境的要点。 所以,现在您可以像这样运行gradle,用ABC值传递param,并在代码中通过${param}使用它的值

gradle :some-service:intTest -Dparam=ABC

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

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

请尝试这一选项:

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

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

task runSomeRandomTask(type: NpmTask, dependsOn: [npmInstall]) {
    environment = [ 'NODE_ENV': 'development', BASE_URL: '3000' ]
    args = ['run']
}
上述Gradle任务集成了Gradle和npm任务


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

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

tasks.taskName {
    environment(mapOf("A" to 1, "B" to "C"))
}
因此,对于
test
任务,这将是:

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

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

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

另一个失败的实验:
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”);资产真实(良好)即使在阅读了帮助之后,我也无法在此处使用换行符。抱歉,假设我想在哪里制作。如果您有更多信息要提供,您应该编辑您的问题。更新了问题。问题不在于Gradle。对于“测试”任务,诸如“环境”、“jvmArgs”和“系统属性”之类的内容被忽略。我拼命想弄明白为什么。我知道测试在一个单独的JVM中运行——那么至少“jvmArgs”应该可以工作,但它不能。如果您只想派生JVM,也可以使用该类。如何将其用于idea任务。在测试任务中工作良好,但不在idea中工作。请建议最好的方法。@Aditchoudhary,您应该首先将测试运行委托给Gradle。您可以在这里看到如何委派它-有时您只需找到您想要的内容…这并不适用于所有任务:
无法找到参数的方法environment()。
这对我有效!当我从Gradle运行服务器时,我只想设置环境变量,这很有效。谢谢然而,systemProperty与环境变量不是一回事,对吗?