【问题标题】:How to set an environment variable from a Gradle build?如何从 Gradle 构建中设置环境变量?
【发布时间】:2016-07-19 06:22:21
【问题描述】:

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

我正在我的 build.gradle 中尝试这个:

task setenv(type: Exec) {
    commandLine "export", "SOME_TEST_VAR=aaa"
}
test.dependsOn setenv

构建失败:

任务 ':myproject:setenv' 执行失败。

启动进程'command 'export''时出现问题

我也试过这个:

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

所以,这里的 Gradle 本身并没有什么问题。

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

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

【问题讨论】:

  • 另一个失败的实验: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"); assertTrue(good);
  • 即使在阅读了帮助之后,我也无法在此处设置换行符。抱歉,请假设我打算在哪里制作它们。
  • 如果您需要提供更多信息,您应该编辑您的问题。
  • 更新了问题。问题不在于 Gradle。

标签: gradle environment-variables build.gradle


【解决方案1】:

对于测试任务,您可以像这样使用environment property

test {
  environment "VAR", "val"
}

你也可以在执行任务中使用environment property

task dropDatabase(type: Exec) {
    environment "VAR", "val"
    commandLine "doit"
}

请注意,使用此方法,环境变量仅在任务期间设置。

【讨论】:

  • 对于“测试”任务,“环境”、“jvmArgs”和“systemProperties”之类的内容将被忽略。我拼命地试图理解为什么。我知道在单独的 JVM 中运行的测试——那么至少“jvmArgs”应该可以工作,但它不能。
  • 如果你只想 fork JVM,也可以使用 JavaExec 类。
  • 如何将其用于创意任务。可以很好地完成测试任务,但不能正常工作。请建议最好的方法。
  • @Aditchoudhary,您应该首先将测试运行委托给 Gradle。您可以在此处查看如何委派它 - mrhaki.blogspot.com/2016/11/…
  • 有时你只是找到你正在寻找的东西......
【解决方案2】:

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

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

【讨论】:

  • 这不适用于所有任务:Could not find method environment() for arguments ...
  • 这对我有用!当我从 Gradle 运行服务器时,我只想设置环境变量,这很有效。谢谢!
  • 如果遇到Could not find method environment() 错误,请确保键和值之间有逗号(,):environment "KEY", "VALUE"
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    task runSomeRandomTask(type: NpmTask, dependsOn: [npmInstall]) {
        environment = [ 'NODE_ENV': 'development', BASE_URL: '3000' ]
        args = ['run']
    }
    

    上述 Gradle 任务集成了 Gradle 和 npm 任务。

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

    【讨论】:

      【解决方案5】:

      这个对我有用,用于设置测试插件的环境变量

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

      【讨论】:

      • 不过,systemProperty 与环境变量不是一回事,对吧?
      【解决方案6】:

      如果您使用 Gradle Kotlin 语法,您也可以这样做:

      tasks.taskName {
          environment(mapOf("A" to 1, "B" to "C"))
      }
      

      所以对于test 任务,这将是:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          请试试这个选项:

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

          【讨论】:

            【解决方案9】:

            需要环境变量来自定义 gradle 任务的执行。 下面是 gradle 7.3.2 中的工作代码,需要将主机和端口传递给黄瓜步骤。

                task runFunctionalTests() {
                dependsOn assemble, testClasses
                doLast {
                    javaexec {
                        mainClass = "io.cucumber.core.cli.Main"
                        classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
                        args = [
                                '--glue', 'com.examples.functional.steps',
                           'src/test/java/com/examples/tests/functional/features'
                        ]
                        environment 'PROTOCOL', 'http'
                        environment "HOST", "myserver"
                        environment 'PORT', '8080'
                    }
                }
            }
            

            然后您在黄瓜步骤中访问环境变量,如下所示

            String host = System.getenv("HOST");
            int port = Integer.parseInt(System.getenv("PORT"));
            String host = System.getenv("PROTOCOL");
            

            【讨论】:

              【解决方案10】:

              在我的项目中,我在子模块中有用于集成测试的 Gradle 任务:

              task intTest(type: Test) {
              ...
              system.properties System.properties 
              ...
              

              这是将所有系统参数注入测试环境的要点。 所以,现在你可以像这样运行 gradle 来传递带有 ABC 值的参数,并在你的代码中通过 ${param} 使用它的值

              gradle :some-service:intTest -Dparam=ABC
              

              【讨论】:

                猜你喜欢
                • 2012-02-06
                • 1970-01-01
                • 2013-11-16
                • 2021-01-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多