Intro
go mod
为了解决没有统一易用的包管理方案,甚至于项目管理方案
因为目前还处于早期阶段,所以需要设置一个环境变量GO111MODULE=on
Command
init
首先,初始化一个包,执行后会生成go.mod
文件。(如果之前用的godep
,在init
时go mod
会自动做包迁移)
go mod init [module name]
# eg
go mod init zto.com/permission
go: creating new go.mod: module zto.com/permission
go: copying requirements from Godeps/Godeps.json
tidy
将引用的包下载下来,未用到的移除掉,执行完毕后会生成一个go.sum
文件
go.sum
就像 yarn.lock
一样,它记录了所有包及包依赖的的记录
包已经装好了,但是如果有使用本地包(GOPATH下自行添加的包)的话还要处理一些东西,因为它不会去$GOPATH
下查找包,只会去$GOPATH/pkg/mod
缓存目录下查找
翻一下go.mod
似乎本地包都没迁移过来,require 里面都没有, 这里就要手动编辑了
replace (
zto.com/codegen-services => ../codegen-services
zto.com/go-contrib => ../go-contrib
)
fine, 顺利运行~ 迁移完毕!
其实,不去手动运行tidy
命令也可以,直接run
或build
都会自动下载并缓存所使用到的包,包存放的目录为$GOPATH/pkg/mod
Goproxy
可能是中国开发者的数量引起的变化,有了Goproxy
这么一个东西,基于国内特色有些网址很难访问到,就算用了魔法也是时断时续,所以官方给了这么一个折衷方案,所有的流量会走代理,然后代理去请求获取相应的包。而且这个代理协议是公开的,所以如果你遵守协定,每个人都可以搭建代理。
Version
通过release tag
获取版本号,比如v0.0.1
,没有release
时使用时间戳加commit hash
作为版本号,如v0.0.0-20170309133038-4fdf99ab2936
。使用go get
时会更新依赖包至最新版本
Compare
package version
Vendor 方案
Go mod 方案
都8102年了还有不支持多版本并存的包管理工具你信?幸亏mod
先释放出来了,不然就要等到9012年了。
经过试验得知:先引用原则,如果本地已经存在需要的包,则直接使用这个包,否则下载Godeps.json
描述的包,但是如果引用的其他包也使用了这个包,并且是不同版本的就会发生冲突了。整个过程中只有第一次下载的时候是有版本要求的,之后不会再下载,为了解决这个问题,我们的项目只能把vendror
目录全部提交上去,最终50MB
的包,2MB
的项目代码。