编译应用程序时,我是否可以要求最低Go版本?
我想确保人们在编译我的应用程序时没有使用Go 1.12或更高版本;主要原因是:编译应用程序时,我是否可以要求最低Go版本?,go,Go,我想确保人们在编译我的应用程序时没有使用Go 1.12或更高版本;主要原因是: return fmt.Errorf("foo: %w", err) 将在Go 1.12中编译良好,但实际上不会像预期的那样运行,因为它需要在Go 1.13或更高版本中进行运行时更改才能获取该%w 即使有一些修改引入了编译错误,比如二进制文本或数值文本中的,一个更好的“you need Go 1.13或更新版”消息会更好,也不会让人混淆,因为不是每个人都熟悉Go,也不知道如何处理语法错误(似乎有些
return fmt.Errorf("foo: %w", err)
将在Go 1.12中编译良好,但实际上不会像预期的那样运行,因为它需要在Go 1.13或更高版本中进行运行时更改才能获取该%w
即使有一些修改引入了编译错误,比如二进制文本或数值文本中的
,一个更好的“you need Go 1.13或更新版”消息会更好,也不会让人混淆,因为不是每个人都熟悉Go,也不知道如何处理语法错误(似乎有些人仍然使用较旧的Go版本)
我在我的go.mod
文件中添加了go 1.13
,但是我仍然可以用旧版本编译它(并且添加go 1.16
和用go 1.15编译也可以)
在编译应用程序时,有没有办法要求最低版本的Go,以防止运行时出现错误并显示友好的错误消息?我能找到的最简单的方法是使用
+build添加一个新文件!go1.13
;由于为所有较新版本添加了Go版本构建标记(Go 1.14具有go1.14
、go1.13
、go1.12
,等等),因此它将仅为Go 1.13之前的版本编译,并将忽略任何较新版本:
// +build !go1.13
package main
func init() {
"You need Go 1.13 or newer to compile this program"
}
这引入了一个故意的编译错误,导致了一条相当不错的错误消息:
$ go install ./cmd/app
# zgo.at/app/cmd/app
cmd/app/old.go:8:2: "You need Go 1.13 or newer to compile this program" evaluated but not used
TIL;干得好。您还可以在
go.mod
中提到最低版本,但这不会阻止您使用较旧版本进行编译。是的,这实际上并没有在@TehSphinX中起到多大作用,尽管它会在较新的go版本IIRC中禁用不兼容的功能,因此您不会“意外”使用它们。但据我所知,这就是它真正的功能。我忘了提到这一点,但我会更新问题,指出这并不像人们预期的那样有效。是的,它只会尝试使用旧版本进行编译,只有在编译失败时才会输出错误。这与您的fmt
示例不同。