一次vendor打包代码折腾过程 #
项目中要打包代码提供给客户(外包公司的味道),由于引用了内网git仓库的私有包,想到了使用vendor打包代码方式,在使用go mod vendor打包时,最终发现 vendor中有遗漏文件的问题 导致打包进 vendor中的私有仓库的代码无法直接被使用而导致编译失败,一开始以为是对 GO111MODULE=off/on 的理解有问题或者使用方式不对导致,最终 在进行 git add 时 强制把vendor下的所有文件进行 commit, git add -f vendor
, 然后在干净的环境中,GO111MODULE=off下可以正常编译
git ignore配置问题 #
后面想找出为什么vendor中文件没有被 git add include,如果知道哪个文件include失败,可以用 git check-ignore
检查,如
git check-ignore -v ‘vendor/github.com/opentracing/opentracing-go/log/field.go’
像图中(右键打开新窗口放大) .gitigignore 设置了 log/
这个会递归应用到 每一个目录下,从而导致vendor中的一些包的 log中的代码无法被include进git add中
go mod vendor 打包使用逻辑 #
如果vendor有完整的包存在, GO111MODULE=off时则优先使用vendor下面的代码包,否则会拉取依赖代码,如果vendor中的文件有缺失,则直接报错在$GOROOT或者$GOPATH中找不到代码包
那么如果GO111MODULE=on进行编译时,是不是也和off一样,优先用vendor中的代码呢?不会!go 会尝试从远程服务器重新拉取代码;
或者 添加-mod=vendor,即使有GO111MODULE=on的情况下(GOPROXY=https://mirrors.aliyun.com/goproxy/ GO111MODULE=on GOPATH=$(GOPATH) CGO_ENABLED=0 go build -mod=vendor)
这等价格于 GO111MODULE=off