49°

【Go专家编程】go module exclude详解

go.mod文件中的exclude指令用于排除某个包的特定版本,其与replace类似,也仅在当前module为main module时有效,其他项目引用当前项目时,exclude指令会被忽略。

exclude指令在实际的项目中很少被使用,因为很少会显式的排除某个包的某个版本,除非我们知道某个版本有严重bug。 比如指令exclude github.com/google/uuid v1.1.0,表示不使用v1.1.0 版本。

下面我们还是使用github.com/renhongcai/gomodule来举例说明。

排除指定版本

github.com/renhongcai/gomodule的v1.3.0版本中,我们的go.mod文件如下:

module github.com/renhongcai/gomodule  

go 1.13

require (
github.com/google/uuid v1.0.0
golang.org/x/text v0.3.2
)

replace golang.org/x/text v0.3.2 => github.com/golang/text v0.3.2

github.com/google/uuid v1.0.0说明我们期望使用 uuid包的v1.0.0版本。

假如,当前uuid仅有v1.0.0v1.1.0v1.1.1三个版本可用,而且我们假定v1.1.0版本有严重bug。 此时可以使用exclude指令将uuid的v1.1.0版本排除在外,即在go.mod文件添加如下内容:

exclude github.com/google/uuid v1.1.0

虽然我们暂时没有使用uuid的v1.1.0版本,但如果将来引用了其他包,正好其他包引用了uuid的v1.1.0版本的话,些时添加的exclude指令就会跳过v1.1.0版本。

下面我们创建github.com/renhongcai/exclude包来验证该问题。

创建依赖包

为了进一步说明exclude用法,我们创建了一个仓库github.com/renhongcai/exclude,并在其中创建了一个modulegithub.com/renhongcai/exclude,其中go.mod文件(v1.0.0版本)如下:

module github.com/renhongcai/exclude

go 1.13

require github.com/google/uuid v1.1.0

可以看出其依赖github.com/google/uuidv1.1.0 版本。创建github.com/renhongcai/exclude的目的是供github.com/renhongcai/gomodule使用的。

使用依赖包

由于github.com/renhongcai/exclude也引用了uuid包且引用了更新版本的uuid,那么在github.com/renhongcai/gomodule引用github.com/renhongcai/exclude时,会被动的提升uuid的版本。

在没有添加exclude之前,编译时github.com/renhongcai/gomodule依赖的uuid版本会提升到v1.10,与github.com/renhongcai/exclude保持一致,相应的go.mod也会被自动修改,如下所示:

module github.com/renhongcai/gomodule

go 1.13

require ( github.com/google/uuid v1.1.0 github.com/renhongcai/exclude v1.0.0 golang.org/x/text v0.3.2 )

replace golang.org/x/text v0.3.2 => github.com/golang/text v0.3.2

但如果添加了exclude github.com/google/uuid v1.1.0 指令后,编译时github.com/renhongcai/gomodule依赖的uuid版本会自动跳过v1.1.0,即选择v1.1.1版本,相应的go.mod文件如下所示:

module github.com/renhongcai/gomodule

go 1.13

require ( github.com/google/uuid v1.1.1 github.com/renhongcai/exclude v1.0.0 golang.org/x/text v0.3.2 )

replace golang.org/x/text v0.3.2 => github.com/golang/text v0.3.2

exclude github.com/google/uuid v1.1.0

在本例中,在选择版本时,跳过uuid v1.1.0版本后还有v1.1.1版本可用,Go 命令行工具可以自动选择v1.1.1版本,但如果没有更新的版本时将会报错而无法编译。

本文由【恋恋美食】发布于开源中国,原文链接:https://my.oschina.net/renhc/blog/3160115

全部评论: 0

    我有话说: