exclude 指令如何在 go.mod 文件中工作?

Kel*_*inS 9 go

新的 Go 1.11 版本引入了非常棒的模块概念。

文档中它说有四个指令可以在go.mod文件中使用:module, require, exclude, replace.

它还解释说:

exclude 和 replace 指令仅在当前(“main”)模块上运行。构建主模块时,将忽略主模块以外的模块中的 exclude 和 replace 指令。因此,replace 和 exclude 语句允许主模块完全控制自己的构建,而不受依赖项的完全控制。

但我仍然不明白该exclude指令是如何工作的。

有人可以向我解释该exclude指令是如何工作的,如果可能,请举例说明何时使用它?

Coo*_*J86 10

这是一个半假设的假设示例:

去.mod

module github.com/example/project

require (
    github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc
    github.com/google/uuid v1.1.0
)

exclude github.com/SermoDigital/jose v0.9.1

replace github.com/google/uuid v1.1.0 => git.coolaj86.com/coolaj86/uuid.go v1.1.1
Run Code Online (Sandbox Code Playgroud)

排除

github.com/SermoDigital/jose包而言,它有一个合适的 git 标签v0.9.1,但当前版本是v1.1,这不是一个合适的 git 标签(缺少“补丁”版本)。

通过排除正确版本化(但不工作)的代码,它会导致 go modmaster取而代之(它没有正确版本化,但具有工作代码)。

代替

同样(并且真正假设),如果我有 .patch 的补丁github.com/google/uuid,我可以创建一个 fork 并使用它replace来获取我自己的版本,同时等待上游版本接受我的补丁(或不接受)。