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

时间:2014-03-24 09:54:05

标签: java encoding groovy gradle environment-variables

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

7 个答案:

答案 0 :(得分:7)

据我所知,您无法从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
}

答案 1 :(得分:7)

我不得不在这个主题上做一些研究,并试图澄清一些未解决的问题。我会在两条评论中这样做,但我还没有足够的声誉。由于我发现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'
}

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

@echo off
echo %FOO%

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

> Task :firstTask
bar

> Task :secondTask
ECHO ist ausgeschaltet (OFF).

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

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

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

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

答案 2 :(得分:1)

有一个更简单的解决方案

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

答案 3 :(得分:0)

Gradle Environment variables. Load from file组合 问题,对于Java插件应该是。

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

答案 4 :(得分:0)

尝试使用the Gradle Wrapper;在项目根文件夹中调用gradlew.sh后,提交新文件(gradlew.batgradle wrapper),然后按以下步骤编辑它们:

  1. gradlew.sh中并添加:
    例如export NODE_OPTIONS=--max_old_space_size=1536
    之前:
    exec "$JAVACMD" "$@"
  2. gradlew.bat中并添加:
    例如set NODE_OPTIONS=--max_old_space_size=1536 (或类似的东西)。
    之前:
    @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

  3. 修改所有调用gradlegradlew

  4. 的脚本,jenkins / travis文件和IDE。
  5. 犯错,所以没有人要再次感到悲伤。

有些人可能认为这很肮脏,其他人则认为是不错的做法-无论哪种方法都可以,并且允许我处理下一个问题;-)

答案 5 :(得分:0)

我可以解决

如果您在 build.gradle 中有类似内容 (从avro模式为文件生成Java类)


    task generateJavaFromSchema(type:JavaExec) {
        main = 'org.apache.avro.tool.Main'
        args 'compile'
        args 'schema'
        args "${fileName}"
        args './src/main/java/'
        classpath = sourceSets.main.compileClasspath
    }

然后gradle希望出现类似“ -PfileName =。/ src / main / resources / A.avsc”的信息, 否则gradle将抱怨fileName未定义


    ./gradlew generateJavaFromSchema -PfileName=./src/main/resources/A.avsc

解决方法:在 gradle.properties

中设置值
<pre>
fileName=./src/main/resources/A.avsc
</pre>

然后执行以下操作,但在以下情况下将使用默认值gradle.properties文件


    ./gradlew generateJavaFromSchema 

如果需要,您仍然可以覆盖命令行


    ./gradlew generateJavaFromSchema -PfileName=./src/main/resources/B.avsc

希望这会有所帮助

答案 6 :(得分:-1)

要为特定任务类型设置环境变量,可以使用以下代码段。环境变量&#34; DOCKER_HOST&#34;将被设置为类型&#34; Exec&#34;。

的所有任务
tasks.withType(Exec) {
    environment "DOCKER_HOST", "tcp://localhost:2375"
}