通过gradle编写环境变量不会显示在系统变量中

时间:2015-02-05 07:23:16

标签: shell groovy gradle android-gradle build.gradle

我正在编写一个gradle脚本,它通过执行shell脚本(在gradle中)来设置环境变量。脚本运行正常,但我从未看到它将结果写入系统环境变量。

摇篮:

def executeOnShell() {
  String command = "export key=value"
  return executeOnShell(command, new File(System.properties.'user.dir'))
}

private def executeOnShell(String command, File workingDir) {
  println command
  def process = new ProcessBuilder(addShellPrefix(command))
                                    .directory(workingDir)
                                    .redirectErrorStream(true) 
                                    .start()
  process.inputStream.eachLine {println it}
  process.waitFor();
  return process.exitValue()
}

private def addShellPrefix(String command) {
  commandArray = new String[3]
  commandArray[0] = "sh"
  commandArray[1] = "-c"
  commandArray[2] = command
  return commandArray
}

当我在shell上运行env命令时,它不显示在系统环境变量中写入的任何内容。有人可以指出我做错了什么,我该如何解决?

注意:我使用的是Mac,所以它是一个终端。编写env应返回所有环境变量。

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您正在尝试通过执行脚本来设置环境变量。如果我正确理解你的描述,甚至还有两个脚本,首先是gradle脚本然后是shell脚本。

流程的环境变量只能由流程本身(在正常条件下)更改。当您执行另一个进程时,该新进程只能更改自己的环境变量,而不能更改它的父进程或任何其他进程。

因此,在您的情况下,您执行gradle脚本,该脚本执行添加环境变量的shell脚本(shell命令)。该变量被添加到graddle进程内的shell进程的环境中,但不会添加到graddle进程的环境中。当shell进程终止然后gradle进程终止时,你将留下一个环境未改变的shell。

你想要达到什么目的?您是否希望在shell中设置变量以供进一步使用?然后使用source(或等效,如果你的shell不是bash)。您是否希望在gradle过程中设置环境变量?然后查看gradle的文档,了解如何设置环境变量。

另请参阅:the difference between sourcing and executing,它解释了为什么由执行脚本设置的环境变量不会粘在父进程中。