go mod的使用技巧
go mod的强大
go mod
确实方便,无视翻墙问题,下载啥都可以。
go mod常用命令
go mod
一般是使用以下命令:
go mod init xxx
go mod tidy
go mod edit
这里着重说下 go mod edit 的作用。
go mod edit
用来修改 go.mod
文件的包的版本关系。
- 修改包版本
-
自定义本地包。方便测试(本地包需要是
module
方式的)module test go 1.12 require ( gopkg v0.0.0 ) replace gopkg v0.0.0 => ../gopkg
这样就可以实现 module
方式,调用本地包了。
go mod edit
修改 go.mod
,然而它有两点缺陷:
- 首先是它的
-require
必须接受“package@version”
这种形式,缺一不可,而且不能识别文档规定的master
和latest
标志。 edit
只适合用于修改依赖版本,给package
改名,屏蔽特定的package
这三个功能,不适用于添加依赖。
由于以上两个特点,因此有了新版的 go get
特性。
新版的go get特性
go get
会自动下载并安装package
,然后更新到go.mod
- 使用
go get package[@version]
来安装指定版本的package
,不指定version
时默认行为和go get package@latest
一样 version
可以是vx.y.z
这种形式或者直接使用commit
的checksum
,也可以是master
或者latest
- 当
version
是latest
时,也就是默认行为,对于有tags
的package
,会选取最新的tag
,对于没有tags
的package
,则选取最新的commit
- 当
version
是master
时,不管package
有没有打tag
,都会选择master
分支的最新commit
- 可以在
version
前使用>,>=,<,<=,表示选取的版本不得超过/低于version
,在这个范围内的符合latest
条件的版本 go get -u
可以更新package
到latest
版本go get -u=patch
将只更新小版本,例如从v1.2.4
到v1.2.5
- 当想要修改
package
的版本时,只需要go get package@
指定的version
即可
注意两个坑:
-
没开
go mod
方式,直接go get
,就是拉取最新的master
分支。 -
开启
go mod
,直接go get
,拉取的是有打tag
,就下载tag
的版本,没打tag
,就拉取最新的master
分支
例子
背景
公司有两个私有项目放在私有 git
上,这里叫 A 和 B,A 项目有引用 B 的包
- 1、
go mod
会自动下载最新tag
的代码,如果没有会自动引入最新的master
提交,这样没问题。但是有tag
的情况下只会引入tag
,没法引用最新的代码(如果 B 有改动必须打Tag
?) - 2、上面的问题可以用
replace
的方案解决,但是如果团队开发,大家的gopath
都不一致,go mod
文件会有多份,如何解决?
解决方案
- 使用
replace
的相对路径(./或../形式
) ,比如:replace github.com/b => ../b
- 手动
go get -u github.com/b@branch
(或者是commit
),go.mod
会自动生成github.com/b@V0.0.0-data-hash