运行 Bazel 使 GetTempPath return C:\Windows\

Running with Bazel makes GetTempPath return C:\Windows\

我有一个调用 GetTempPathW 并尝试在 returned 目录中创建临时文件的测试。当我直接 运行 测试时, GetTempPathW returns C:\Users\sgreens\AppData\Local\Temp\ 并且它通过了。当我 运行 它与 bazel test 时,它 returns C:\Windows\ 并且测试无法在那里创建文件。

来自documentation of GetTempPath

The GetTempPath function checks for the existence of environment variables in the following order and uses the first path found:

  1. The path specified by the TMP environment variable.
  2. The path specified by the TEMP environment variable.
  3. The path specified by the USERPROFILE environment variable.
  4. The Windows directory.

在 cmd window 我 运行 bazel 来自:

C:\Users\sgreens\yeti\yeti>echo %TMP%
C:\Users\sgreens\AppData\Local\Temp

C:\Users\sgreens\yeti\yeti>echo %TEMP%
C:\Users\sgreens\AppData\Local\Temp

C:\Users\sgreens\yeti\yeti>echo %USERPROFILE%
C:\Users\sgreens

C:\Users\sgreens\yeti\yeti>echo %WINDIR%
C:\WINDOWS

在我构建时生成的CROSSTOOL中:

  env_entry {
    key: "TMP"
    value: "C:\Users\sgreens\AppData\Local\Temp"
  }
  env_entry {
    key: "TEMP"
    value: "C:\Users\sgreens\AppData\Local\Temp"
  }

Bazel 做了什么导致 GetTempPath 到 return C:\Windows\?我该如何解决?

可能相关的问题: '$' sign in the output base make all tests failed on windows

当您直接 运行 测试时,您 运行 它在您的正常命令环境中。该测试看到与您相同的环境变量,即它使用您打印的 TMP/TEMP 变量。

当您 运行 使用 bazel test 进行测试时,Bazel 运行 将其置于精简的环境中,并尽可能少地定义环境变量。 Bazel 这样做是为了使测试尽可能可重现:如果测试依赖于客户端环境,那么更改环境变量可能会使其通过或使其失败,我们不希望出现这种不可预测的行为。

这是一个已知问题,我正在积极解决它:https://github.com/bazelbuild/bazel/issues/2870

您的解决方法是使用 --test_env=TMP。此标志告诉 Bazel 将您的 TMP 值复制到测试环境。