Golang 的包管理工具

使用 NodeJS 的时候, 使用官方给的 npm 进行包管理, 后来出现 yarn 进行并行处理, nrm 进行 repo 源管理.

就 golang 来讲, 官方提供 dep 来管理依赖, 还有 glide 也相对不错.

自从 2020 年以来, Go Mod 模式越来越成熟, 原来的 dep, glide 已经渐渐退出历史舞台, 大家统一使用 go mod 进行包管理.

Go 1.11 Modules

golang 1.11+ 版本, 开启 GO111MODULE=on 环境变量.

go mod [command]

  1. init 初始化一个新的 Go 项目
  2. tidy 拉取缺少的模块, 移除无用模块
  3. download 下载依赖到 cache 目录
  4. graph 输出依赖树
  5. vendor 将依赖转换成本目录的 vendor 模式
  6. verify 验证依赖是否正确
  7. why 解释为什么需要依赖

清理缓存依赖: go clean -modcache

文件夹内会有 go.modgo.sum 文件, 依赖文件存储在 $GOPATH/pkg/mod/{cache,...} 文件夹下.

文档 https://juejin.im/post/5c8e503a6fb9a070d878184a

dep

文档 https://godoc.org/github.com/golang/dep

可用命令

dep [command]

  1. init 初始化一个新的 Go 项目, 或者集成已有项目
  2. status 查看当前项目依赖树
  3. ensure 安装依赖
  4. prune 现在在执行 ensure 后自动执行 prune
  5. version 查看当前版本

初始化后, 会生成 Gopkg.lockGopkg.toml 文件, 还有 vendor 文件夹.

glide

文档 https://github.com/Masterminds/glide

可用命令

glide [command]

  1. init 初始化一个新的 Go 项目, 或者集成已有项目
  2. get github.com/xx/yy 下载包并且纳入 glide.yaml
  3. install 根据 glide.yaml 配置下载依赖
  4. import 从其他版本管理中迁移到 glide.yaml 中
  5. update 更新依赖到新版本
  6. –version 查看当前版本

初始化后, 会生成 glide.lockglide.yaml 文件,
还有 vender 文件夹.

错误管理

关于出现 golang_org ... malformed module path ... missing dot in first path element 错误的问题

例如在执行 go mod vender/why 等的时候, 会报错类似下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
wss imports
github.com/go-redis/redis imports
crypto/tls imports
golang_org/x/crypto/chacha20poly1305: malformed module path "golang_org/x/crypto/chacha20poly1305": missing dot in first path element
wss imports
github.com/go-redis/redis imports
crypto/tls imports
golang_org/x/crypto/curve25519: malformed module path "golang_org/x/crypto/curve25519": missing dot in first path element
wss imports
github.com/go-redis/redis imports
net imports
golang_org/x/net/dns/dnsmessage: malformed module path "golang_org/x/net/dns/dnsmessage": missing dot in first path element
wss imports
github.com/go-redis/redis imports
net imports
golang_org/x/net/lif: malformed module path "golang_org/x/net/lif": missing dot in first path element
wss imports
github.com/go-redis/redis imports
net imports
golang_org/x/net/route: malformed module path "golang_org/x/net/route": missing dot in first path element
wss imports
github.com/go-redis/redis imports
crypto/tls imports
crypto/x509 imports
golang_org/x/crypto/cryptobyte: malformed module path "golang_org/x/crypto/cryptobyte": missing dot in first path element
wss imports
github.com/go-redis/redis imports
crypto/tls imports
crypto/x509 imports
golang_org/x/crypto/cryptobyte/asn1: malformed module path "golang_org/x/crypto/cryptobyte/asn1": missing dot in first path element
wss imports
github.com/go-redis/redis imports
net tested by
net.test imports
golang_org/x/net/nettest: malformed module path "golang_org/x/net/nettest": missing dot in first path element
....

主要原因是在 net, crypto 等内置模块中, 引入了 golang_org/x/net/... 这样的路径, 造成无法找到依赖模块.

找了很久问题, 终于在 $GOROOT 下找到了内置 net 模块代码, 其中确实引用的地址是 golang_org/x/net/..., 但是依赖路径 $GOPATH/pkg/mod/ 下却只有 golang.org/x/net/... 模块,在 $GOROOT/src/vender 目录下终于找到 golang_org 字样

后来我发现, 我的 golang 版本为 1.13.4 也是最新的版本. 但是按照方法为 brew install go 安装的 1.11.x, 后期又使用 brew upgrade go 进行更新到当前最新版本的. 于是打算卸载 brew 方式安装的 go 而采用 官方提供的 pkg 方式重新安装.

1
brew uninstall go --ignore-dependencies

--ignore-dependencies 表示忽略依赖, 比如原来有 dep, glide 的要依赖于 go 那么不加这个参数会不让卸载.

使用官方推荐的方式安装, 下载 pkg 安装包, 直接下一步就可以安装完成.

重新进入 $GOROOT/src/vender 目录, 发现依赖文件夹 golang.org, 已经改过来了.

至此, 重新执行 go mod vender/why 无报错.

原因: 使用 brew install go 安装的 golang 有问题.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.