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.0 、v1.1.0和v1.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/uuid 的 v1.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.1.0,与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版本,但如果没有更新的版本时将会报错而无法编译。
赠人玫瑰手留余香,如果觉得不错请给个赞~本篇文章已归档到GitHub项目,求星~ 点我即达