当前,internal/version
和 gotip
包中的 Run
函数在 Package 的命令失败时返回退出状态 1
:
if err := cmd.Run(); err != nil {
// TODO: return the same exit status maybe.
os.Exit(1)
}
os.Exit(0)
我正在开发一个 Package 各种 go
命令的软件包,并为 go
工具的不同版本添加测试支持。不幸的是,现在有一个检查退出状态 2 的测试失败了。
我正在本地使用这个修补过的版本:
diff --git a/gotip/main.go b/gotip/main.go
index 6338234..0a8f0db 100644
--- a/gotip/main.go
+++ b/gotip/main.go
@@ -57,9 +57,8 @@ func main() {
}
cmd.Env = dedupEnv(caseInsensitiveEnv, append(os.Environ(), "GOROOT="+root, "PATH="+newPath))
if err := cmd.Run(); err != nil {
- if _, ok := err.(*exec.ExitError); ok {
- // TODO: return the same exit status maybe.
- os.Exit(1)
+ if err, ok := err.(*exec.ExitError); ok {
+ os.Exit(err.ExitCode())
}
log.Fatalf("gotip: failed to execute %v: %v", gobin, err)
}
diff --git a/internal/version/version.go b/internal/version/version.go
index a63c649..349bd6e 100644
--- a/internal/version/version.go
+++ b/internal/version/version.go
@@ -61,7 +61,9 @@ func Run(version string) {
}
cmd.Env = dedupEnv(caseInsensitiveEnv, append(os.Environ(), "GOROOT="+root, "PATH="+newPath))
if err := cmd.Run(); err != nil {
- // TODO: return the same exit status maybe.
+ if err, ok := err.(*exec.ExitError); ok {
+ os.Exit(err.ExitCode())
+ }
os.Exit(1)
}
os.Exit(0)
8条答案
按热度按时间kqqjbcuj1#
听起来对我来说很合理!
svgewumm2#
https://golang.org/cl/221978提到了这个问题:
dl: exit with the exit code returned by cmd.Run
nzrxty8p3#
在https://golang.org/cl/221978中,我已添加了
internal/compat
包。如果CL被批准,gotip
和internal/version
包中有两个重复的函数可以移动到那里:homedir
和dedup
。dedup
函数也有重复的测试。jutyujz04#
我打开了#37037,并为
dl
创建了一个CL链,将gotip
与version
合并。我已经等待了一个月的审查,但实际上所有内容都可以存在于internal/version
中,避免额外的包,简化您的CL。wgx48brx5#
最终,除了
homedir
和dedup
之外,剩余的重复代码是const caseInsensitiveEnv
、func exe
、func goroot
和main
函数。我不反对你的 CL,但我认为为具有兼容性问题的功能创建一个compat
包会使代码更具可读性。hmmo2u0o6#
我已经更新了 https://golang.org/cl/221978 。除了重新基线,我还添加了新的
go:build
指令。谢谢。
ktca8awb7#
@dmitshur,当你有时间时,你能审查https://golang.org/cl/221978吗?我认为它已经准备好合并了。
谢谢。
nwlqm0z18#
@dmitshur,既然
dl
包需要go 1.18版本,使用`exec.ExitError应该没问题。我已经更新了我的CL。谢谢。