我有一个文件包含一些应该在Go 1.5+上运行的测试.
我能够使用Go运行版runtime.Version()
并进行各种比较.
但是,测试文件导入golang.org/x/net/http2
.该http2
包需要request.Cancel()
从net/http
,但仅适用于进入1.5+.
这导致我的CI环境中的这些错误导致构建失败:
../../../golang.org/x/net/http2/transport.go:214: req.Cancel undefined (type *http.Request has no field or method Cancel)
../../../golang.org/x/net/http2/transport.go:218: req.Cancel undefined (type *http.Request has no field or method Cancel)
../../../golang.org/x/net/http2/transport.go:777: req.Cancel undefined (type *http.Request has no field or method Cancel)
Run Code Online (Sandbox Code Playgroud)
我尝试添加// +build go1.5
到文件的顶部,但它不起作用.
无论如何我可以限制单元测试文件,以便它只在Go 1.5+系统上构建和测试?
在构建约束是这样做的正确方法.
但请注意,您的错误消息是指在Go 1.6http2
中添加的包,因此您至少需要go1.6
构建约束.
构建约束
// +build go1.5
Run Code Online (Sandbox Code Playgroud)
将导致使用Go 1.5及更高版本编译文件.因此,如果您希望您的测试文件仅使用Go 1.6及更高版本进行编译和运行,请使用
// +build go1.6
Run Code Online (Sandbox Code Playgroud)
另外不要忘记:
约束可能出现在任何类型的源文件中(不仅仅是Go),但它们必须出现在文件顶部附近,前面只有空白行和其他行注释.这些规则意味着在Go文件中,构建约束必须出现在package子句之前.
要将构建约束与包文档区分开来,必须在一系列构建约束后面加一个空行.
一个工作的例子:
1 // +build go1.6
2
3 package yourpackage
Run Code Online (Sandbox Code Playgroud)