我有一个文件,其中包含一些应该在Go 1.5 +上运行的测试。
我可以使用runtime.Version()
获取Go运行时版本并进行各种比较。
但是,测试文件会导入golang.org/x/net/http2
。 http2
包需要来自request.Cancel()
的{{1}},但这仅适用于Go 1.5 +。
这导致我的CI环境中的这些错误导致构建失败:
net/http
我尝试将../../../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)
添加到文件的顶部,但它不起作用。
我是否可以限制单元测试文件,以便仅在Go 1.5+系统上构建和测试?
答案 0 :(得分:7)
build constraints是正确的方法。
但请注意,您的错误消息引用http2
包added in Go 1.6,因此您至少需要go1.6
构建约束。
构建约束
// +build go1.5
将导致使用 Go 1.5及更高版本编译文件。因此,如果您希望您的测试文件仅使用Go 1.6及更高版本进行编译和运行,请使用
// +build go1.6
也不要忘记:
约束可能出现在任何类型的源文件中(不仅仅是Go),但它们必须在文件顶部附近显示,前面只有空行和其他行注释。这些规则意味着在Go文件中,构建约束必须出现在package子句之前。
要区分构建约束和包文档,一系列构建约束必须后跟一个空行。
一个工作示例:
1 // +build go1.6
2
3 package yourpackage