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.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)

文档更新时间: 2020-08-08 22:03   作者:kuteng