go module的常规操作
为当前module添加一个依赖
package main import ( "github.com/google/uuid" "github.com/sirupsen/logrus" ) func main() { logrus.Println("hello, go module mode") logrus.Println(uuid.NewString()) }
问题
直接 go build 会报错
$go build main.go:4:2: no required module provides package github.com/google/uuid; to add it: go get github.com/google/uuid
实现方式
一:go get
Go 编译器提示我们,go.mod 里的 require 段中,没有哪个 module 提供了 github.com/google/uuid 包,如果我们要增加这个依赖,可以手动执行 go get 命令。那我们就来按照提示手工执行一下这个命令
$go get github.com/google/uuid go: downloading github.com/google/uuid v1.3.0 go get: added github.com/google/uuid v1.3.0
将我们新增的依赖包下载到了本地 module 缓存里,并在 go.mod 文件的 require 段中新增了一行内容:
require ( github.com/google/uuid v1.3.0 //新增的依赖 github.com/sirupsen/logrus v1.8.1 )
二:go mod tidy
在执行构建前自动分析源码中的依赖变化,识别新增依赖项并下载他们:
$go mod tidy go: finding module for package github.com/google/uuid go: found github.com/google/uuid in github.com/google/uuid v1.3.0
但对于复杂的项目变更而言,逐一手工添加依赖项显然很没有效率,go mod tidy 是更佳的选择。
查询
查询已发布的版本
我们还是以上面提到过的 logrus 为例,logrus 现在就存在着多个发布版本,我们可以通过下面命令来进行查询:
$go list -m -versions github.com/sirupsen/logrus github.com/sirupsen/logrus v0.1.0 v0.1.1 v0.2.0 v0.3.0 v0.4.0 v0.4.1 v0.5.0 v0.5.1 v0.6.0 v0.6.1 v0.6.2 v0.6.3 v0.6.4 v0.6.5 v0.6.6 v0.7.0 v0.7.1 v0.7.2 v0.7.3 v0.8.0 v0.8.1 v0.8.2 v0.8.3 v0.8.4 v0.8.5 v0.8.6 v0.8.7 v0.9.0 v0.10.0 v0.11.0 v0.11.1 v0.11.2 v0.11.3 v0.11.4 v0.11.5 v1.0.0 v1.0.1 v1.0.3 v1.0.4 v1.0.5 v1.0.6 v1.1.0 v1.1.1 v1.2.0 v1.3.0 v1.4.0 v1.4.1 v1.4.2 v1.5.0 v1.6.0 v1.7.0 v1.7.1 v1.8.0 v1.8.1
查询当前module的所有依赖
$go list -m all github.com/bigwhite/module-mode github.com/cespare/xxhash/v2 v2.1.1 github.com/davecgh/go-spew v1.1.1 ... ... github.com/go-redis/redis/v8 v8.11.1 ... ... gopkg.in/yaml.v2 v2.3.0
升级 / 降级依赖的版本
实现方式
一:go get 执行带版本号
$go get github.com/sirupsen/logrus@v1.7.0 go: downloading github.com/sirupsen/logrus v1.7.0 go get: downgraded github.com/sirupsen/logrus v1.8.1 => v1.7.0
二:go mod edit 明确版本号
$go mod edit -require=github.com/sirupsen/logrus@v1.7.0 $go mod tidy go: downloading github.com/sirupsen/logrus v1.7.0
移除依赖
要想彻底从项目中移除 go.mod 中的依赖项,仅从源码中删除对依赖项的导入语句还不够。这是因为如果源码满足成功构建的条件,go build 命令是不会“多管闲事”地清理 go.mod 中多余的依赖项的。
那正确的做法是怎样的呢?我们还得用 go mod tidy 命令,将这个依赖项彻底从 Go Module 构建上下文中清除掉。go mod tidy 会自动分析源码依赖,而且将不再使用的依赖从 go.mod 和 go.sum 中移除。
特殊情况:使用 vendor
在 Go 1.14 及以后版本中,如果 Go 项目的顶层目录下存在 vendor 目录,那么 go build 默认也会优先基于 vendor 构建,除非你给 go build 传入 -mod=mod 的参数。