自从 CL 81895 , os.Getenv
和 os.LookupEnv
都记录了测试日志中的键:
https://cs.opensource.google/go/go/+/master:src/os/env.go;l=98-115;drc=b2faff18ce28edad98303d2c3134dec1331fd7b5
然而, os.Environ
没有:
https://cs.opensource.google/go/go/+/master:src/os/env.go;l=137-141;drc=b2faff18ce28edad98303d2c3134dec1331fd7b5
这意味着,例如,一个遍历 os.Environ()
寻找键的程序与那些确切相同键上调用 LookupEnv
的程序具有不同的缓存行为。这种差异在执行子进程的测试中尤为明显,因为子进程访问的变量(可能非常重要,特别是在像 golang.org/x/tools/go/packages
这样的库的情况下!)最终不会被记录在缓存键中。
(例如,请参阅 Getenv
循环在 testenv.GoToolPath
中的样子!)
我不确定这个差异是有意的决定还是疏忽。无论如何,我认为我们应该考虑在调用 os.Environ
或 execenv.Default
时在测试日志中记录所有键。
(CC @ianlancetaylor)
2条答案
按热度按时间k5ifujac1#
This question is motivated by:
bq9c1y662#
我注意到这实际上是对 https://go.dev/cl/81895 : https://go-review.googlesource.com/c/go/+/81895/comment/486513ce_5f69647f/ 的未解决评论。将所有
os.Environ
添加到测试哈希的主要问题是,这意味着当用户运行调用os.Environ
的测试时,这些测试通常不会被哈希。例如,我当前的环境至少有以下具有不可预测值的变量:SESSION_MANAGER
、SSH_AUTH_SOCK
、GNOME_TERMINAL_SCREEN
。如果我连续运行两次测试,缓存会生效,但如果我先运行它,然后登出,再登录并再次运行它,则不会生效。