如何通过任务在gradle中设置环境变量?

我有gradle应用程序。 我的主要gradle文件包含一些任务(groovy)。 我需要在启动我的任务时 – 环境变量“LANG”设置encoding = ru_RU.koi8-r(对于windows,linux),并在完成我的任务后 – 环境变量包含初始值(en_US.UTF-8) 。 怎么样? 请帮帮我。

我不得不在这个主题上做一些研究,并试图澄清一些未解决的问题。 我会在两条评论中这样做,但我还没有足够的声誉。 由于我发现Igor Ganapolsky也在其他网站上发表评论但每次都没有回答我觉得有必要在这里写另一个答案,即使这个问题实际上已经得到了回答。

正如Martin Rajniak所说,你可以像他所展示的那样设置一个环境变量。 但该变量仅对其定义的任务或相应的过程有效。 这意味着您无法在以下任务中使用它。 我通过定义两个依赖任务来validation:

 task('firstTask', type:Exec) { environment "FOO", "bar" workingDir '.' commandLine 'cmd', '/c', 'print.bat' } task ('secondTask', type:Exec) { dependsOn firstTask workingDir '.' commandLine 'cmd', '/c', 'print.bat' } 

print.bat命令只回显环境变量:

 @echo off echo %FOO% 

使用命令gradle secondTask运行构建将产生:

 > Task :firstTask bar > Task :secondTask ECHO ist ausgeschaltet (OFF). 

因此, secondTask不再存在环境变量。

对于实际主题来说太多了,但还有另外一件重要的事情,这可能是Igor问题的原因:方法environment不适用于每个Gradle任务。 正如您在Exec -task-type文档中所看到的,为Exec -task-type显式定义了方法environment

为了完整,我想提一下,您可以使用JavaExec -task-type及其方法systemProperty将变量传递给java进程。 但是你不能在这里使用environment ,因为没有为JavaExec -task-type定义该方法。

但是,我自己仍在寻找一种方法来定义一个对整个构建有效的环境变量,而无需通过操作系统直接定义它。

据我所知,您无法从Gradle Task设置系统环境变量。

但是,可以为该过程设置环境变量。 因此,如果您只需要为构建设置环境变量,请使用:

 task MyTask(type: Exec) { environment 'ENVIRONMENT_VARIABLE_NAME', 'environment_variable_value' // run or build code that needs that environment variable } 

您还可以根据该任务进行编译,因此如果您构建代码,则在编译之前设置环境变量:

 tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn MyTask } 

有一个更简单的解决方案

 tasks.withType(org.gradle.api.tasks.testing.Test) { systemProperty 'host', 'DEV' } 

要为特定任务类型设置环境变量,可以使用以下代码段。 环境变量“DOCKER_HOST”将设置为“Exec”类型的所有任务。

 tasks.withType(Exec) { environment "DOCKER_HOST", "tcp://localhost:2375" }