我有一个调用GetTempPathW
的测试,并尝试在返回的目录中创建临时文件。当我直接运行测试时,GetTempPathW
会返回C:\Users\sgreens\AppData\Local\Temp\
并且它会通过。当我使用bazel test
运行它时,它会返回C:\Windows\
并且测试无法在那里创建文件。
来自documentation of GetTempPath:
GetTempPath函数检查环境是否存在 变量按以下顺序排列并使用找到的第一个路径:
- TMP环境变量指定的路径。
- TEMP环境变量指定的路径。
- USERPROFILE环境变量指定的路径。
- Windows目录。
醇>
在cmd窗口中,我运行了来自:
的bazelC:\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
答案 0 :(得分:1)
直接运行测试时,可以在正常的命令环境中运行它。测试会看到与您相同的环境变量,即它使用您已打印的TMP
/ TEMP
变量。
当您使用bazel test
运行测试时,Bazel会在精简的环境中运行它,并尽可能少地定义环境变量。 Bazel这样做是为了使测试尽可能重现:如果测试依赖于客户端环境,那么更改环境变量可能会让它通过或使其失败,我们也不会想要这种不可预测的行为。
这是一个众所周知的问题,我正积极致力于解决它:https://github.com/bazelbuild/bazel/issues/2870
您的解决方法是使用--test_env=TMP
。此标志告诉Bazel将TMP
值复制到测试环境。