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项目,求星~ [点我即达](https://github.com/RainbowMango/GoExpertProgramming)