运行 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:
- The path specified by the TMP environment variable.
- The path specified by the TEMP environment variable.
- The path specified by the USERPROFILE environment variable.
- 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
值复制到测试环境。
我有一个调用 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:
- The path specified by the TMP environment variable.
- The path specified by the TEMP environment variable.
- The path specified by the USERPROFILE environment variable.
- 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
值复制到测试环境。