【问题标题】:How do set environment variable in gradle via task?如何通过任务在 gradle 中设置环境变量?
【发布时间】:2014-05-01 14:32:18
【问题描述】:

我有毕业申请。我的主要 gradle 文件包括一些任务(groovy)。 我需要在启动我的任务时 - 环境变量“LANG”设置编码 = ru_RU.koi8-r(适用于 windows、linux),并且在我的任务完成后 - 环境变量包含初始值(en_US.UTF-8) . 怎么做?请帮帮我。

【问题讨论】:

  • 你能举一个简单的例子来说明你有什么吗?问题是什么?
  • 我认为您唯一的解决方案是在这里System.setenv()
  • 我写:task myTask { String environment = System.getenv("LANG") println "environment = " + environment System.setenv("ru_RU.koi8-r") // class System 没有方法 'setenv' } 但是类 System 没有方法 'setenv'!
  • 无方法签名:静态 java.lang.System.setenv() 适用于参数类型:(java.lang.String) 值:[ru_RU.koi8-r] 可能的解决方案:getenv( java.lang.String), getenv(), setIn(java.io.InputStream), setErr(java.io.PrintStream), setOut(java.io.PrintStream), getAt(java.lang.String)
  • 我不相信你可以在运行时设置系统环境变量

标签: java encoding groovy gradle environment-variables


【解决方案1】:

我必须对此主题进行一些研究,并将尝试澄清一些未解决的问题。我会在两个 cmets 中这样做,但我还没有足够的声誉。因为我在其他网站上也发现了 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-task-type 明确定义的。

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

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

【讨论】:

  • 嗨,你有这个答案吗?请分享我必须在想法任务中设置环境变量。
  • 抱歉,我没有深入探讨这个话题。
【解决方案2】:

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

【讨论】:

  • 我不断收到错误消息:Could not find method environment() for arguments [MY_KEY, myvalue]
  • 这只适用于(类型:Exec)或在测试{}闭包中
【解决方案3】:

结合Gradle Environment variables. Load from file 问题,对于Java插件它会是..

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

【讨论】:

    【解决方案4】:

    有一个更简单的解决方案

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

    【讨论】:

    • 问题是关于 env 属性。这对我有用,但在你的回答中提到它是有道理的,它不会在环境中放置任何东西,而是在系统属性中。
    • 没用,我不得不使用environment 而不是systemProperty
    【解决方案5】:

    尝试使用the Gradle Wrapper;在项目根文件夹中调用gradle wrapper后提交新文件(gradlew.sh & gradlew.bat),然后编辑如下:

    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的脚本、jenkins/travis文件和IDE

    4. 承诺,这样就没有人再感到悲伤了。

    有些人可能认为这很脏,而另一些人则认为这是一个好的 hack - 无论哪种方式它都可以工作并让我进入下一个问题;-)

    【讨论】:

      【解决方案6】:

      我有一个可能的解决方法

      如果你有类似 build.gradle 的东西 (从 avro 模式为文件生成 java 类)

      任务生成JavaFromSchema(类型:JavaExec){ 主 = 'org.apache.avro.tool.Main' 参数“编译” args '模式' 参数“${文件名}” 参数'./src/main/java/' 类路径 = sourceSets.main.compileClasspath }

      然后 gradle 需要类似“-PfileName=./src/main/resources/A.avsc”的东西, 否则 gradle 会报错 fileName not defined

      ./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

      希望对你有帮助

      【讨论】:

        【解决方案7】:

        这可能对确切的问题没有直接帮助,但如果你是为了例如直接从 IntelliJ IDEA 的终端运行 gradle 或 gradle wrapper 任务,您可以在直接在终端中运行 gradle 任务之前设置所需的变量。只要同一个终端仍然打开,该变量就会在内存中。

        因此,如果您需要设置一个环境变量,然后在某个地方的 gradle 构建中使用,您可以直接在终端中这样做:

        set VAR_NAME=var_value
        gradle clean build
        

        设置 VAR_NAME 变量后,构建(或您在同一终端中运行的任何其他 gradle 任务)将使用您在 VAR_NAME 变量中设置的值(假设任务在某处使用它)

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • 不适用于项目级别和默认任务类型。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-16
          • 2014-01-26
          • 2021-05-28
          • 1970-01-01
          • 2012-02-06
          • 1970-01-01
          • 2015-05-01
          相关资源
          最近更新 更多