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