使用Bazel运行使GetTempPath返回C:\ Windows \

时间:2017-09-18 19:09:26

标签: c++ windows bazel

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

来自documentation of GetTempPath

  

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

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

在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

1 个答案:

答案 0 :(得分:1)

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

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

这是一个众所周知的问题,我正积极致力于解决它:https://github.com/bazelbuild/bazel/issues/2870

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