随笔

Go mod

Intro

go mod 为了解决没有统一易用的包管理方案,甚至于项目管理方案
因为目前还处于早期阶段,所以需要设置一个环境变量GO111MODULE=on

Command

image.png

init

首先,初始化一个包,执行后会生成go.mod文件。(如果之前用的godep,在initgo 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

image.png

tidy

将引用的包下载下来,未用到的移除掉,执行完毕后会生成一个go.sum文件 after tidy
go.sum就像 yarn.lock一样,它记录了所有包及包依赖的的记录
包已经装好了,但是如果有使用本地包(GOPATH下自行添加的包)的话还要处理一些东西,因为它不会去$GOPATH下查找包,只会去$GOPATH/pkg/mod缓存目录下查找 after tidy and run
翻一下go.mod似乎本地包都没迁移过来,require 里面都没有, 这里就要手动编辑了

replace (
    zto.com/codegen-services => ../codegen-services
    zto.com/go-contrib => ../go-contrib
)

fine, 顺利运行~ 迁移完毕!
其实,不去手动运行tidy命令也可以,直接runbuild都会自动下载并缓存所使用到的包,包存放的目录为$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 vendor

Go mod 方案
Go mod
都8102年了还有不支持多版本并存的包管理工具你信?幸亏mod先释放出来了,不然就要等到9012年了。
经过试验得知:先引用原则,如果本地已经存在需要的包,则直接使用这个包,否则下载Godeps.json描述的包,但是如果引用的其他包也使用了这个包,并且是不同版本的就会发生冲突了。整个过程中只有第一次下载的时候是有版本要求的,之后不会再下载,为了解决这个问题,我们的项目只能把vendror目录全部提交上去,最终50MB的包,2MB的项目代码。

本文链接:https://note.lilonghe.net/post/golang-mod.html

-- EOF --