go os,os/exec:应该在测试日志中记录环境变量吗?

tkqqtvp1  于 3个月前  发布在  Go
关注(0)|答案(2)|浏览(43)

自从 CL 81895 , os.Getenvos.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.Environexecenv.Default 时在测试日志中记录所有键。
(CC @ianlancetaylor)

bq9c1y66

bq9c1y662#

我注意到这实际上是对 https://go.dev/cl/81895 : https://go-review.googlesource.com/c/go/+/81895/comment/486513ce_5f69647f/ 的未解决评论。将所有 os.Environ 添加到测试哈希的主要问题是,这意味着当用户运行调用 os.Environ 的测试时,这些测试通常不会被哈希。例如,我当前的环境至少有以下具有不可预测值的变量:SESSION_MANAGERSSH_AUTH_SOCKGNOME_TERMINAL_SCREEN 。如果我连续运行两次测试,缓存会生效,但如果我先运行它,然后登出,再登录并再次运行它,则不会生效。

相关问题