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

17 java groovy encoding environment-variables gradle

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

Fen*_*cer 8

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

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

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'
}
Run Code Online (Sandbox Code Playgroud)

该命令print.bat仅响应环境变量:

@echo off
echo %FOO%
Run Code Online (Sandbox Code Playgroud)

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

> Task :firstTask
bar

> Task :secondTask
ECHO ist ausgeschaltet (OFF).
Run Code Online (Sandbox Code Playgroud)

所以环境变量不再存在了secondTask.

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

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

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


Mar*_*iak 7

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

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

task MyTask(type: Exec) {
  environment 'ENVIRONMENT_VARIABLE_NAME', 'environment_variable_value'

  // run or build code that needs that environment variable
}
Run Code Online (Sandbox Code Playgroud)

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

tasks.withType(JavaCompile) {
  compileTask -> compileTask.dependsOn MyTask
}
Run Code Online (Sandbox Code Playgroud)

  • 我一直收到错误:`找不到参数[MY_KEY,myvalue]`的方法环境() (14认同)
  • 这只适用于(类型:Exec)或 test {} 闭包 (4认同)

Kee*_*bze 7

与 Gradle 环境变量结合。从文件加载 问题,对于Java插件来说是..

tasks.withType(JavaExec) {
    file('.env').readLines().each() {
        def (key, value) = it.tokenize('=')
        environment key, value
    }
}
Run Code Online (Sandbox Code Playgroud)