一尘不染

如果文件运行在go 1.4及更低版本的系统上,如何跳过该文件?

go

我有一个文件,其中包含一些应在Go 1.5+上运行的测试。

我可以使用runtime.Version()并进行各种比较来获取Go运行时版本。

但是,测试文件import golang.org/x/net/http2。该http2软件包需要request.Cancel()from
net/http,但仅在Go 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)

我尝试添加// +build go1.5到文件的顶部,但是没有用。

无论如何,我是否可以限制单元测试文件,以便仅在Go 1.5+系统上对其进行构建和测试?


阅读 257

收藏
2020-07-02

共1个答案

一尘不染

构建约束是这样做的正确方法。

但是请注意,您的错误消息引用了Go
1.6
http2添加的软件包,因此您至少需要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
2020-07-02