Module 相关的命令
大多数 go 命令可以在 模块感知模式 下或者 GOPATH模式 下运行。在模块感知模式下,go 命令使用 go.mod 文件去查找版本依赖项,它通常从模块缓存 加载包,下载丢失的模块。在 GOPATH 模式下, go 命令会忽略模块;它在 vendor目录 和 GOPATH中查找依赖项。
自Go 1.16开始,默认情况下启用模块感知模式,无论是否存在 go.mod 文件。在较低的版本中,当 go.mod 文件在当前目录或者任意父目录存在的时候,模块感知模式被启动。
模块感知模式可以通过 GO111MODULE 环境变量来控制,该变量可以被设置为 开,关 或者 自动。
- 如果
GO111MODULE=off,go命令忽略go.mod文件并在GOPATH模式下运行。 - 如果
GO111MODULE=on或未设置,go命令在模块感知模式下运行,即使没有go.mod文件。并非所有的命令在没有go.mod文件的情况下都能工作:请参阅 模块外的模块命令。 - 如果
go111module = auto,则go命令在模块感知模式下运行,如果当前目录或任意父目录中存在go.mod文件。在1.15和更低,这是默认行为。go mod子命令和go install使用版本查询以模块感知模式运行,即使没有go.mod文件存在。
在模块感知模式下,GOPATH 不再定义构建期间导入的含义,但它仍存储下载的依赖项(在 GOPATH/pkg/mod;请参阅模块缓存)和已安装的命令(在 GOPATH/bin,除非设置了 GOBIN )。
构建命令
包的加载信息的所有命令都是模块感知的。这包括:
go buildgo fixgo generatego getgo installgo listgo rungo testgo vet
当在模块感知模式下运行时,这些命令使用 go.mod 文件去解释命令行上列出的或者在 Go 源文件中写入的导入路径。这些命令接受所有模块命令共有的以下标志。
-mod标志控制是否可以自动更新go.mod以及是否使用vendor目录。-modcacherw标志指示go命令用读-写权限创建模块缓存中的新目录,而不是使它们只读。当该标志始终使用(通常在环境变量中设置GOFLAGS=-modcacherw或者通过运行go env -w GOFLAGS=-modcacherw)时,可以用像rm -r样的命令删除模块缓存而先不改变权限。go clean -modcache命令可以在无论-modcacherw是否使用的时候来删除模块缓存。-modfile=file.mod标志指示go命令读取(并可能写入)模块根目录下的替代文件而不是go.mod文件。这个文件的名字必须以.mod结尾。go.mod文件必须仍然存在以便于确定模块根目录,但是不能访问它。当指定了-modfile时,go.sum替代文件也会被用到:它的路径是从-modfile标志派生出来的,通过修剪掉.mod扩展名并添加.sum扩展名.
Vendoring
使用模块时, go 命令通常通过将模块从它们的源下载到模块缓存中,然后从下载的副本加载包来满足依赖关系。Vendoring可用于允许与旧版本的Go互操作,或者确保用于构建的所有文件存储在单个文件树中。
go mod vendor 命令在 主模块的 根目录中创建名为 vendor 的目录,该目录包含构建和测试主模块中的包所需的所有包的副本。不包括仅由主模块外部的包测试导入的包。与 go mod tidy 和其他命令一样,构建约束 (除了 ignore ) 在构造 vendor 的时候是不会被考虑的。
go mod vendor 还会创建 vendor/modules.txt 文件,该文件包含供应商软件包及其复制源的模块版本列表。当启用vendoring时,此清单用作模块版本信息的来源,如同 go list -m 和 go version -m 所报告的那样。当 go 命令读取 vendor/modules.txt 时,它会检查模块版本是否与 go.mod 一致。如果 go.mod 自 vendor/modules.txt 生成之时变动了, go 命令将会报告一个错误。 go mod vendor 应再运行以更新 vendor 目录。
如果 vendor 目录存在于主模块的根目录中,若在主模块go.mod 文件 中 go 版本 大于等于 1.14时,将自动使用该目录。为了显式启动 vendoring,请在调用 go 命令的时候带上 -mod=vendor 标志。要禁用vendoring,请使用-mod=readonly 或 -mod=mod 标志。
当启动了vendoring,构建命令 比如 go build和 go test 会从 vendor 目录加载包,而不是访问网络或者本地的模块缓存。 go list -m 命令仅仅打印 go.mod 中列出的关于包的信息。 go mod 命令中例如 go mod download 和 go mod tidy 在vendoring启动时工作方式没有不同,依旧会下载模块并访问模块缓存。 go get 在vendoring启动时工作方式也没有什么不同。
与 GOPATH 模式中的vendoring 不同, go 命令会忽略主模块的根目录以外位置的vendor目录。另外,由于未使用其他模块中的vendor目录, go 命令在构建 模块 zip 文件 (但请参见 #31562 和 #37397 等已知的bug) 时不会包括vendor目录。
go get
用法:
go get [-d] [-t] [-u] [build flags] [packages]
例子:
#升级特定模块。
$ go get -d golang.org/x/net
#升级由主模块中的包导入带来的包的模块。
$ go get -d -u ./...
# 升级或降级到模块的特定版本。
$ go get -d golang.org/x/text@v0.3.2
# 更新到模块的主分支机构上的提交。
$ go get -d golang.org/x/text@master
#删除对模块的依赖并降级需要它的模块到不需要它的版本。
$ go get -d golang.org/x/text@none
该 go get 命令更新主模块go.mod 文件 中的模块依赖关系 ,然后构建和安装命令行中列出的包。
第一步是确定要更新哪些模块。 go get 接受包列表、包模式和模块路径作为参数。如果指定了包参数,go get 则会更新提供包的模块。如果指定了包模式(例如,all 或带有... 通配符的路径),go get 会将模式扩展为一组包,然后更新提供这些包的模块。如果参数命名模块而不是包(例如,模块 golang.org/x/net 在其根目录中没有包),go get 将更新模块但不会构建包。如果没有指定参数,go get 就像指定了. 一样(当前目录中的包);这可以与-u 标志一起使用来更新提供导入包的模块。
每个参数可以包括一个版本查询后缀,表示所需的版本,如go get golang.org/x/text@v0.3.0。版本查询后缀由@符号和版本查询组成,可以表示一个特定的版本(v0.3.0),一个版本前缀(v0.3),一个分支或标签名称(master),一个修订版(1234abcd),或者一个特殊查询latest、upgrade、patch或none。如果没有给出版本,go get使用@upgrade查询。
如果 go get将其参数解析为特定的模块和版本,go get将在主模块的 go.mod文件中添加、更改或删除require指令,以确保这些模块在未来保持所需的版本。请注意,go.mod文件中的要求版本是最小的版本,可能会随着新的依赖关系的加入而自动增加。参见Minimal version selection (MVS),详细了解如何通过模块感知命令来选择版本和解决冲突。
当命令行上命名的模块被添加、升级或降级时,如果命名的模块的新版本需要其他更高版本的模块,其他模块可能会被升级。例如,假设模块example.com/a升级到版本v1.5.0,该版本要求模块example.com/b在版本v1.2.0。如果模块example.com/b目前需要的版本是v1.1.0,go get example.com/a@v1.5.0也会将example.com/b升级到v1.2.0。
当命令行上命名的模块降级或删除时,其他模块可能会降级。 继续上面的示例, 假设模块 example.com/b 降级到 v1.1.0。 模块 example.com/a 也将需要被降级为跟 example.com/b 一样的版本 v1.1.0 或更低版本的版本。

模块使用版本后缀 @none 可能被删除。 这是一种特殊的降级。 依赖于被删除模块将根据需要降级或删除。 即使主模块中的包导入了一个或多个模块,也可以删除该模块要求。 在这种情况下, 下一个构建命令可能会添加新的模块要求。
如果一个模块需要两个不同的版本 (在命令行参数中显式指定或为了满足升级和降级), go get 将报告错误。
go get 选择一组新版本后, 它将检查是否有任何新选择的模块版本或任何提供命令行上命名的包的模块被 retracted 或 deprecated。 go get 将为找到的每个已撤回的版本或不推荐使用的模块打印警告。 go list -m -u all 可用于检查所有依赖项中的撤回和弃用。
在go get更新go.mod文件后,它建立了在命令行上命名的软件包。可执行文件将被安装在由GOBIN环境变量命名的目录中,如果没有设置GOPATH环境变量,则默认为$GOPATH/bin或$HOME/go/bin。
go get支持以下标志(参数)。
-d标志告诉go get不要构建或安装软件包。当使用-d时,go get将只管理go.mod中的依赖项。在未加-d的标志下使用go get来构建和安装软件包已经被弃用(从Go 1.17开始)。在Go 1.18中,-d将一直被启用。-u标志告诉go get升级模块,提供直接或间接导入由命令行上命名的包。由-u选择的每个模块将被升级到其最新版本,除非它已经被要求在一个更高的版本(预发布)。-u=patch标志(不是-u patch)也告诉go get升级依赖关系,但go get将把每个依赖关系升级到最新的补丁版本(与@patch版本查询类似)。-t标志告诉go get考虑构建在命令行上命名的软件包测试所需要的模块。当-t和-u一起使用时,go get也将更新测试的依赖性。-insecure标志不应该再被使用。它允许go get解决自定义导入路径,并使用不安全的方案(如HTTP)从存储库和模块代理处获取。GOINSECURE环境变量提供了更细化的控制,推荐使用。
从 Go 1.16 开始, go install 是构建和安装程序的建议命令. 当与版本后缀 (如 @latest 或 @v1.4.6)一起使用时, go install 以模块感知模式构建包, 忽略当前目录或任何父目录中的 go.mod 。
go get 更侧重于管理 go.mod 中的需求。 -d 标志已被弃用, 在 Go 1.18 中, 它将始终处于启用状态。
go install
用法:
go install [build flags] [packages]
示例:
# Install the latest version of a program,
# ignoring go.mod in the current directory (if any).
$ go install golang.org/x/tools/gopls@latest
# Install a specific version of a program.
$ go install golang.org/x/tools/gopls@v0.6.4
# Install a program at the version selected by the module in the current directory.
$ go install golang.org/x/tools/gopls
# Install all programs in a directory.
$ go install ./cmd/...
go install 命令生成并安装由命令行上的路径命名的包。 可执行文件 (main 包) 安装到由 GOBIN 环境变量命名的目录中,该环境变量默认为 $GOPATH/bin 或 $HOME/go/bin 如果未设置 GOPATH 环境变量. $GOROOT 中的可执行文件安装在 $GOROOT/bin 或 $GOTOOLDIR 中,而不是 $GOBIN。非可执行程序包已构建并缓存,但未安装。
自 Go 1.16 以来, 如果参数具有版本后缀 (如 @latest 或者 @v1.0.0), 则 go install 以模块感知模式构建程序包, 忽略当前目录或任何父目录中的 go.mod 文件(如果有) 。 这对于在不影响主模块依赖关系的情况下安装可执行文件非常有用。
为了消除在构建中使用哪些模块版本的歧义,参数必须满足以下约束。
- 参数必须是包路径或包模式(有
...通配符)。它们不能是标准包(如fmt)、元模式(std、cmd、all)或相对或绝对文件路径。 - 所有参数必须有相同的版本后缀。不同的查询是不允许的,即使它们引用的是同一个版本。
- 所有参数必须引用同一模块中同一版本的包。
- 包路径参数必须引用
main包。模式参数将只匹配 “main”包。 - 没有模块被认为是主模块。
- 如果包含命令行上命名的包的模块有一个
go.mod文件,它不能包含指令(replace和exclude),如果它是主模块,会导致它被不同的解释。 - 该模块不能要求自己有更高的版本。
- 任何模块中都不使用供应商目录。(供应商目录不包括在 module zip files中,所以
go install不会下载它们。)
- 如果包含命令行上命名的包的模块有一个
关于支持的版本查询语法,请参见版本查询。Go 1.15及以下版本不支持在go install中使用版本查询。
如果参数没有版本后缀,go install可能在模块感知模式或GOPATH模式下运行,取决于GO111MODULE环境变量和go.mod文件的存在。详见模块感知命令。如果启用了模块感知模式,go install会在主模块的上下文中运行,这可能与包含被安装软件包的模块不同。
go list -m
用法:
go list -m [-u] [-retracted] [-versions] [list flags] [modules]
示例:
$ go list -m all
$ go list -m -versions example.com/m
$ go list -m -json example.com/m@latest
go list -m 列出模块而不是包. 在此模式下, go list 的参数可以是模块,模块模式 (包含 ... 通配符), 版本查询, 或者特殊的模式 all, 它匹配 构建列表中的所有模块。如果未指定参数, 则列出 主模块。
列出模块时, -f 指定应用于 Go 结构体的格式模板, Module 结构体:
type Module struct {
Path string // module path
Version string // module version
Versions []string // available module versions (with -versions)
Replace *Module // replaced by this module
Time *time.Time // time version was created
Update *Module // available update, if any (with -u)
Main bool // is this the main module?
Indirect bool // is this module only an indirect dependency of main module?
Dir string // directory holding files for this module, if any
GoMod string // path to go.mod file for this module, if any
GoVersion string // go version used in module
Deprecated string // deprecation message, if any (with -u)
Error *ModuleError // error loading module
}
type ModuleError struct {
Err string // 错误本身
}
默认输出是打印模块路径,然后打印关于版本和替换的信息(如果有)。 例如, go list -m all 可能打印:
example.com/main/module
golang.org/x/net v0.1.0
golang.org/x/text v0.3.0 => /tmp/text
rsc.io/pdf v0.1.1
Module结构有一个String方法,它格式化了该行输出行,使默认格式相当于-f'{{.String}}'。
请注意,当模块已被替换时,其Replace字段描述了替换模块模块,其Dir字段被设置为替换模块的源代码(如果存在)。 (即,如果Replace是非nil,那么dir被设置为Replace.Dir,没有访问替换源代码。)
-u标志添加有关可用升级的信息。当给定模块的最新版本较新的时,list -u将模块的Update字段设置为有关较新模块的信息。list -u也打印当前所选版本是否是retracted以及模块是否为deprecated。模块的String方法通过在当前版本后格式化括号中的较新版本来表示可用升级。例如,go list -m -u all可能打印:
example.com/main/module.
golang.org/x/old v1.9.9(已弃用)
golang.org/net v0.1.0(缩回)[v0.2.0]
golang.org/x/text v0.3.0 [v0.4.0] => / tmp / text
rsc.io/pdf v0.1.1 [v0.1.2]
(对于工具,go list -m -u -json all可能更方便解析。)
-versions标志用于list将模块的Versions字段设置为该模块的所有已知版本的列表,根据语义版本控制排序,最低到最高版本。该标志还将更改默认输出格式以显示模块路径,然后显示空格分隔的版本列表。除非还指定了-retracted标志,否则从此列表中省略了缩回版本。
-retracted标志指示list在用-versions标志打印的列表中显示缩回版本,并考虑在解析版本查询时缩回版本。例如,go list -m -retracted example.com/m@latest显示了模块example.com/m的最高版本或预发布版本,即使该版本也是如此缩回。 retract 指令和deprecations由此版本的go.mod文件加载。-retracted标志加入 Go 1.16。
模板函数module采用一个字符串参数,必须是模块路径或查询,并将指定的模块返回为modulestruct。如果发生错误,则结果将是Module具有非零error字段的结构。
go mod download
用法:
go mod download [-json] [-x] [modules]
例子:
$ go mod download
$ go mod download golang.org/x/mod@v0.2.0
go mod download命令将命名模块下载到module cache。参数可以是模块路径或模块模式选择主模块的依赖性或版本查询的表单path @ version。没有参数,download适用于 main module的所有依赖项。
go命令将根据普通执行期间自动下载模块。go mod download命令主要用于预填充模块缓存或以module proxy加载数据。
默认情况下,download写入标准输出的内容。它将进度消息和错误打印到标准错误。
-json标志用于download 打印一个json对象序列到标准输出,描述每个下载的模块(或失败),对应于此 Go 结构体:
type Module struct {
Path string//模块路径
Version string //模块版本
Error string//错误加载模块
Info string //缓存.info文件绝对路径
GoMod string //缓存.mod文件的绝对路径
Zip string //缓存.zip文件的绝对路径
DIR String //缓存源根目录的绝对路径
Sum string // 路径和版本的校验(如go.sum)
GoModSum string string //go.mod文件的校验(如go.sum)
}
-x标志用于download打印命令download向标准错误执行。
###go mod编辑
用法:
go mod edit [editing flags] [-fmt|-print|-json] [go.mod]
例子:
#添加替换指令。
$ go mod edit -replace example.com/a@v1.0.0=./a
#删除替换指令。
$ go mod edit -dropreplace example.com/a@v1.0.0
#设置Go版本,添加要求,并打印文件
#而不是将其写入磁盘。
$ go mod edit -go=1.14 -require=example.com/m@v1.0.0 -print
#格式化go.mod文件。
$ go mod edit -print tools/go.mod
#格式并打印不同的.mod文件。
$ go mod edit -fmt -print tools/go.mod
#打印Go.mod文件的JSON表示。
$ go mod edit -json
go mod edit 命令提供了用于编辑和格式化go.mod文件的命令行界面,主要由工具和脚本使用。 go mod edit 只读一个go.mod文件;它不会查找有关其他模块的信息。默认情况下,go mod edit 读取并写入go.mod文件的主模块,但可以在编辑标志之后指定不同的目标文件。
编辑标志指定了一系列编辑操作。
-module标志改变模块的路径(go.mod文件的模块行)。-go=version标志设置了预期的 Go 语言版本。-require=path@version和-droprequire=path标志在给定的模块路径和版本上添加和下降要求。请注意,-require覆盖对path的任何现有要求。这些标志主要用于了解模块图形的工具。用户应该更喜欢get path@version或go get path@none,它使其他go.mod调整,以满足其他模块施加的约束。请参阅go get。-exclude=path@version和-dropexclude=path@version标志添加并删除给定模块路径和版本。请注意,-exclude=path@version如果该排除已存在,则为一个无操作。-replace=old[@v]=new[@v]标志添加了给定模块路径和版本对的替换。如果省略@v在old@v中,则添加没有左侧版本的替换,这适用于旧模块路径的所有版本。如果省略@av在new@ v中,则新路径应该是本地模块根目录,而不是模块路径。请注意,-replace覆盖old[@v]的任何冗余替换,因此省略@v将删除特定版本的替换。-dropreplace=old[@v]标志删除给定模块路径和版本对的替换。如果提供@v,则删除使用给定版本的替换。没有左侧版本的现有替换可能仍可替换模块。如果省略@v,则删除没有版本的替换。-retract=version和-dropretract=version标志添加和下降给定版本的退回,这可能是单个版本(如v1.2.3)或间隔(如[v1.1.0,v1.2.0])。请注意,-retract标志无法为retract指令添加一个理由评论。建议使用基本评论,可以通过go list -m -u和其他命令显示。
可以重复编辑标志。更改以指定的顺序应用。
go mod edit具有控制其输出的其他标志。
-fmt标志重新格式化go.mod文件而不进行其他更改。使用或重写go.mod文件的任何其他修改也暗示了该重新格式化。需要此标志的唯一时间是如果没有指定其他标志,则在go mod edit -fmt.中。-print标志以其文本格式打印最终go.mod,而不是将其写回磁盘。-JSON标志以JSON格式打印最终go.mod,而不是以文本格式将其写入磁盘。 JSON输出对应于这些GO类型:
type Module struct {
Path string
Version string
}
type GoMod struct {
Module Module
Go string
Require []Require
Exclude []Module
Replace []Replace
}
type Require struct {
Path string
Version string
Indirect bool
}
type Replace struct {
Old Module
New Module
}
type Retract struct {
Low string
High string
Rationale string
}
请注意,这仅描述go.mod文件本身,而不是间接引用的其他模块。对于可用于构建的全套模块,请使用go list -m -json all。请参阅go list -m。
例如,工具可以通过解析go mod edit -json 的输出来获取go.mod文件作为数据结构。然后可以通过调用go mod edit更改,配合-require,-exclude等等。
工具也可以使用包golang.org/x/mod/modfile解析,编辑和格式go.mod文件。
go mod graph
用法:
go mod graph [-go=version]
go mod graph 命令打印模块要求图(用替换)以文本形式为单位。例如:
example.com/main example.com/a @v1.1.0
example.com/main example.com/b@v1.2.0.
example.com/a@v1.1.0 example.com/b@v1.1.1.
example.com/a@v1.1.0 example.com/c@v1.3.0
example.com/b@v1.1.0 example.com/c@v1.1.0
example.com/b@v1.2.0 example.com/c@v1.2.0.
模块图中的每个顶点表示模块的特定版本。图中的每个边缘表示对依赖性的最小版本的要求。
go mod graph打印图形的边缘,每行一个。每行都有两个空间分隔的字段:模块版本和其依赖项之一。每个模块版本被标识为表单path@version的字符串。主模块没有@version后缀,因为它没有版本。
-go标志用于go mod graph以报告给定的go版本加载的模块图,而不是go指令所示的版本在go.mod文件中。
有关如何选择版本的详细信息,请参见最小版本选择(MVS)。另请参见go list -m用于打印所选版本和go mod why要了解为什么需要模块。
go mod init
用法:
go mod init [module-path]
例子:
go mod init.
go mod init example.com/m
go mod init命令初始化和写入当前目录中的新go.mod文件,实际上创建一个源地为当前目录的新模块。尚不存在go.mod文件。
init接受一个可选参数,新模块的module path。有关选择模块路径的说明,请参阅Module paths。如果省略模块路径参数,则init将尝试使用.go文件,自动加载包工具配置文件和当前目录中的导入注释来推断模块路径(如果在GOPATH)。
如果存在用于自动加载包工具的配置文件,则init将尝试从中导入模块要求。init支持以下配置文件。
GLOCKFILE(Glock)Godeps/Godeps.json(Godeps)Gopkg.lock(dep)dependencies.tsv(godeps)glide.lock(glide)vendor.conf(trash)vendor.yml(govend)vendor/manifest(gvt)vendor/vendor.json(govendor)
自动加载包工具配置文件不能始终以完美的保真性翻译。例如,如果在不同的版本中导入同一存储库中的多个包,并且存储库仅包含一个模块,则导入的go.mod只能在一个版本中要求模块。您可能希望运行go list -m all来检查构建列表中的所有版本,go mod tidy添加缺少要求并降低未使用的要求。
go mod tidy
用法:
go mod tidy [-e] [-v] [-go=version] [-compat=version]
go mod tidy可确保go.mod文件与模块中的源代码匹配。它增加了构建当前模块的软件包和依赖性所需的任何缺少的模块要求,并且它会删除对不提供任何相关包的模块的要求。它还将任何缺少的条目添加到go.sum并删除不必要的条目。
-e标志(在Go 1.16中添加)用于命令go mod tidy忽略加载包时遇到的错误。
-v标志用于命令go mod tidy打印有关删除模块的信息到标准错误。
go mod tidy作品通过加载main module和他们导入的所有包裹递归。这包括由测试导入的包(包括其他模块中的测试)。go mod tidy仅启用所有构建标记,因此它将考虑特定于特定于自定义构建标记的文件,即使通常不构建这些源文件。有一个例外:ignore构建标记未启用,因此不会考虑带有构建约束// +build ignore的文件。请注意,go mod tidy不会考虑名为testdata的目录中的主模块中的包或以 . 或_开头的名称,除非其他包明确导入这些包。
一旦go mody已加载这组包,它确保提供一个或多个包的每个模块在主模块的go.mod中具有 require 指令。 文件如果主模块处于go 1.16或以下 - 是另一个所需模块所需的。go mod tidy将在最新版本的每个缺少模块上添加要求(参见版本查询的定义 latest版本)。go mod tidy将删除 require 模块的指令,这些模块不会在上面描述的设置中提供任何包。
go mod tidy也可以添加或删除//indirect关于indirect指令的评论。// indirect 注释表示不提供主模块中包导入包的模块。 (参见require directive 有关// indirect依赖项和评论已添加。)
如果设置了-go标志,则go mod tidy将更新go指令到指示的版本,启用或禁用module图修剪和延迟module加载(并根据版本需要添加或删除间接要求)。
默认情况下,go mod tidy将检查模块图加载模块图时的选定的版本 不会更改模块图通过立即在go指令中指示的版本之前的Go版本。检查兼容性的版本化也可以通过-compat标志显式明确指定。
go mod vendor
用法:
go mod vendor [-e] [-v]
go mod vendor命令在main module’s根目录中构建名为vendor的目录包含支持主模块中包的构建和测试所需的所有包的副本。仅包括主模块外部的包的测试只导入的软件包。与go mod tidy一样和其他模块命令构建约束 除了构建 vendor目录时不考虑除ignore之外。
启用模块加载时,go命令将从vendor目录加载包,而不是从其源从它们的源下载模块并使用packages over下载的副本。有关更多信息,请参见Vendoring。
go mod vendor也创建文件vendor/modules.txt ,其中包含从中复制的vendored软件包列表和模块版本。当启用助行品时,此清单用作模块版本信息的源,如go list -m报告和go version -m。当go命令读取vendor/modules.txt时,它会检查模块版本与go.mod一致。如果go.mod自vendor/modules.txt生成,则应该再次运行go mod vendor。
请注意,go mod vendor如果在重新构建之前存在,则删除vendor目录。不应对副款软件包进行本地更改。go命令没有检查vendor目录中的软件包尚未修改,但是通过运行 go mod vendor,可以验证vendor 目录的完整性并检查没有更改。
-e标志(在Go 1.16中添加)用于go mod vendor尽管在加载软件包时遇到错误,但仍尝试继续运行。
-v标志用在go mod vendor打印模块的名称和包到标准错误。
go mod verify
用法:
go mod verify
go mod verify 检查存储在 main module的依赖关系自从下载以来,尚未修改module cache 。要执行此检查,请验证go mod verify哈希每个下载的模块.zip文件和提取目录,然后将这些哈希与哈希进行比较,当第一次下载模块时录制的哈希值。go mod verify 检查构建列表中的每个模块(可以用go list - m all)。
如果所有模块都未修改,则go mod verify打印「所有模块验证」。否则,它报告了哪些模块已更改并以非零状态退出。
请注意,所有模块感知命令都验证了主模块的go.sum文件哈希匹配为模块缓存中的哈希。如果go.sum缺少哈希值(例如,因为第一次使用模块),go命令使用checksum database验证其哈希值(除非模块路径由 GOPRIVATE 或 GONOSUMDB)匹配。有关详细信息,请参见验证modules。
相比之下, go mod verify 检查模块.zip文件及其提取的目录是否有哈希匹配在第一次下载模块缓存中录制的哈希值。这对于在下载和验证模块后,可以检测模块缓存中文件的更改。go mod verify不下载不在缓存中的模块的内容,它不使用go.sum文件来验证模块内容。但是, go mod verify可以下载go.mod文件以执行最小版本选择。它将使用go.sum来验证这些文件,它可能会添加go.sum条目,用于丢失哈希。
go mod why
用法:
go mod why [-m] [-vendor] packages...
go mod why 在主模块到每个列出的包中的导入图中显示最短路径。
输出的是一系列节,每一个节用于命令行中的每个包或模块,由空行分隔。每个节开始于以#为目标包或模块开始的注释行。后续行通过导入图,每行一个包。如果未从主模块引用包或模块,则节将显示一个单个括号表示事实。
例如:
$ go mod why golang.org/x/text/language golang.org/x/text/encoding
# golang.org/x/text/language
rsc.io/quote
rsc.io/sampler
golang.org/x/text/language
# golang.org/x/text/encoding
(main module does not need package golang.org/x/text/encoding)
-m标志原因go mod why将其参数视为模块列表。go mod why将打印每个模块中的任何包的路径。注意,即使使用-m,go mod why 查询包图,而不是go mod graph打印的模块图。
-vendor标志原因go mod why忽略主模块外部的包的测试中的导入(如go mod vendor)。默认情况下,go mod why认为由all模式匹配的包的图表。在第1.16页中,在声明Go 1.16或更高的模块中,此标志没有效果(使用go指令在go.mod中,因为all的含义更改为匹配go mod vendor匹配的包集。
go version -m
用法:
go version [-m] [-v] [file ...]
例子:
#打印Go版本用于构建Go。
$ go version
#打印Go版本用于构建特定的可执行文件。
$ go version ~/go/bin/gopls
#打印Go版本和模块版本用于构建特定可执行文件。
$ go version -m ~/go/bin/gopls
#打印Go版本和模块版本用于在目录中构建可执行文件。
$ go version -m ~/go/bin/
go version报告Go版本用于构建命令行中名为的每个可执行文件。
如果命令行上没有命名文件,则go version打印其自己的版本信息。
如果命名目录,则go version递归遍历该目录,寻找识别的GO二进制文件并报告其版本。默认情况下,go version在目录扫描期间不会报告无法识别的文件。-v标志用于报告无法识别的文件。
-m标志原因 go version打印每个可执行文件的嵌入式模块版本信息。对于每个可执行文件,go version -m打印一个与下面的标签分隔列的表。
$ go version -m ~/go/bin/goimports
/home/jrgopher/go/bin/goimports: go1.14.3
path golang.org/x/tools/cmd/goimports
mod golang.org/x/tools v0.0.0-20200518203908-8018eb2c26ba h1:0Lcy64USfQQL6GAJma8BdHCgeofcchQj+Z7j0SXYAzU=
dep golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
dep golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
表格的格式可能会在将来发生变化。可以从runtime/debug.ReadBuildInfo获得相同的信息。
表中每行的含义由第一列中的单词确定。
path:main包的路径,用于构建可执行文件。mod:包含main包装的模块。列分别是 module 路径,版本和 sum 。main module具有版本(devel),没有sum。dep:提供一个或多个链接到可执行文件的软件包的模块。与mod相同的格式。=>:前一行上模块的replacement 。如果替换是本地目录,则仅列出目录路径(无版本或 sum)。如果替换是模块版本,则列出了路径,版本和总和,与mod和dep。替换模块没有sum。
go clean -modcache
用法:
go clean [-modcache]
-modcache标志原因go clean以删除整个module cache,包括未包装的源代码的版本化依赖项。
这通常是删除模块缓存的最佳方法。默认情况下,模块缓存中的大多数文件和目录都是只读的,以防止测试和编辑在他们已经认证之后从无意中更改的文件。不幸的是,这会导致命令像rm -r失败,因为在没有首先使父目录可写的情况下无法删除文件。
-modcacherw标志(由go build接受和其他模块感知命令)导致新模块缓存中的目录可转换。将-modcacherw传递给所有模块感知命令,将其添加到GOFLAGS 变量。GOFLAGS 可以设置在环境中或go env -w。例如,下面的命令将永久设置:
Go Env -w goflags = -modcacherw
-modcacherw应谨慎使用;开发人员应注意不要在模块缓存中更改文件。go mod verify可用于检查主模块的go sum文件中的缓存中匹配的文件哈希。
版本查询
有几个命令允许您使用 版本查询 指定模块的版本,该版本出现在命令行上的模块或包路径之后@字符之后。
例子:
go get example.com/m@latest
go mod download example.com/m@master
go list -m -json example.com/m@e3702bed2
版本查询可能是以下之一:
- 一个完全指定的语义版本,例如
v1.2.3,它选择特定版本。查看Versions相关语法。 - 语义版本前缀,例如
v1或v1.2,它选择具有该前缀的最高可用版本。 - 语义版本比较,例如
<v1.2.3或> = v1.5.6,它选择最接近的可用版本到比较目标(>和> =的最低版本,以及<和<=的最高版本)。 - 底层源存储库的修订标识符,例如提交哈希前缀,修订标记或分支名称。如果使用语义版本标记修订版,则此查询选择该版本。否则,此查询选择用于基础提交的伪-version。请注意,无法以这种方式选择包含其他版本查询匹配的名称的分支和标记。例如,查询
v2选择与v2开始的最新版本,而不是名为v2的分支。 - 字符串
latest,它选择最高可用版本版本。如果没有版本版本,latest选择最高的预发行版本。如果没有标记版本,latest为默认分支尖端的提交选择伪版本。 - 字符串
upgrade,它就像latest,除了如果模块当前在更高版本时比版本latest将选择(例如,预发布),upgrade将选择当前版本。 - 字符串
patch,它选择具有与当前所需版本相同的主要和次要版本号的最新可用版本。如果目前没有版本,则patch等同于latest。由于Go 1.16,get get在使用patch时需要一个当前版本(但-u = patch标志没有此要求)。
除查询特定名为版本或修订之外,所有查询都考虑go list -m -versions报告的可用版本(参见go list -m)。此列表仅包含标记版本,而不是伪版本。由exclude 指令不允许的模块版本在主模块的go.mod文件中不考虑。retract指令所涵盖的版本在中的go.mod文件中最新相同模块的版本也被忽略,除非-retracted标志与go list -m一起使用,除非加载retract 指令。
Release 版本优先于预发布版本。例如,如果版本v1.2.2和v1.2.3-pre可用,则最新查询将选择v1.2.2即使v1.2.3-pre较高。<v1.2.4查询还将选择v1.2.2,即使v1.2.3- pre更接近v1.2.4。如果没有可用版本或预发布版本,则latest, upgrade,和patch查询将为提交提示选择一个伪版本存储库的默认分支。其他查询将报告错误。
模块在模块外部的命令
模块感知Go命令通常在main module中运行,由go.mod文件中定义工作目录或父目录。某些命令可以在没有go.mod文件的情况下以模块感知模式运行,但大多数命令都以不同的方式工作或报告没有go.mod文件时出现的错误。
有关启用和禁用模块感知模式的信息,请参阅Module感知命令。
| 命令 | 行为 |
|---|---|
go build go doc go fix go fmt go generate go install go list go run go test go vet |
只能加载命令行上指定为.go文件的标准库和包中的包。无法构建来自其他模块的软件包,因为没有录制模块要求的地方并确保确定性构建。 |
go get |
可以像往常一样构建和安装软件包和可执行文件。请注意,当go get没有go.mod文件时,没有主模块,因此 replace 和exclude 指令不能使用。 |
go list -m |
大多数参数需要显式版本查询 除非使用- versions标志。 |
go mod download |
大多数参数都需要显式版本查询。 |
go mod edit |
需要一个显式文件参数。 |
go mod graph go mod tidy go mod vendor go mod verify go mod why |
这些命令需要go.mod文件,如果不存在一个,则会报告错误。 |
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
关于 LearnKu
推荐文章: