【问题标题】:Running with Bazel makes GetTempPath return C:\Windows\使用 Bazel 运行会使 GetTempPath 返回 C:\Windows\
【发布时间】:2017-09-18 19:09:26
【问题描述】:

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

来自documentation of GetTempPath

GetTempPath 函数检查环境是否存在 变量按以下顺序并使用找到的第一个路径:

  1. TMP 环境变量指定的路径。
  2. TEMP 环境变量指定的路径。
  3. USERPROFILE 环境变量指定的路径。
  4. Windows 目录。

在 cmd 窗口中,我从以下位置运行 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 返回C:\Windows\?我该如何解决?

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

【问题讨论】:

    标签: c++ windows bazel


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2022-11-23
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多