扯淡的话,可以跳过
闲来无事,把公司项目的包管理做了一个升级,其实好久之前就想去做升级,一直懒得摆弄,就没当回事,知道本地vendor遇到一些莫名的问题,PC端代码中可以看到github/xxx一个包,包括代码等都可以查看到,push到远程后,vendor里面只是一个@版本号之类的东西~,并没有代码,在服务端编译的时候,如果没有一些特殊配置(梯子),这个vendor+版本号的玩意是会出问题,提示找不到github/xxx这个包。。后来干脆把之前的依赖重搞一遍省的之后头疼????
go mod 简单介绍
- go语言自诞生起,包依赖管理一直是被各大社区吐槽的点
项目必须放在GOPATH下,包括依赖的包也需要放GOPATH下
如果有多个项目,需要依赖不同版本的包,就会很蛋疼
- 非官方包管理的出现
- govendor
- dep
用法不详述了
基本就是自动拉包放置在vendor下
在经历了前期很多个版本的混乱下 go官方在golang 1.11版本后加入了go mod,直接砍掉了之前的GOPATH设计,也支持vendor模式,个人觉得真的比之前好用了很多
go mod 说明
-
在同一目录下的项目(非GOPATH/src目录下),go 会自动去检测,该项目下的go mod(不使用IDE,可以在$GOPATH/mod目录下查看)
- p1包执行 go mod init xxx/xxx/p1,此时就会生成一个module
- p2去使用p1包如下所示(
看这张图的意思,只是想解释一下mod的意思,其实和我们使用java 或者 php 时引入的包一个含义,go项目想要被其他项目引用,需要把自己变成一个模块,也就是需要执行 go mod init xxx/xxx/p1
)
在了解了mod的意思之后,其实使用起来很便捷
准备工作
- GO111MODULE=off: 不适用 modules 功能。
- GO111MODULE=on: 使用 modules 功能,不会去 GOPATH 下面查找依赖包。
- GO111MODULE=auto: Golang 自己检测是不是使用 modules 功能。
go mod 使用方式
- 在项目目录下执行
go mod init git.staff.qsc.com.cn/common/gateway
go mod tidy
查找并下载gateway项目依赖的所有包
go mod vendor
将该模块使用的第三方包移动到vendor下(支持vendor的形式是为了打包更快,大部分公司都已经使用自动化集成,在不依赖工具、环境的情况下,还是将包约束到vendor下比较合理) -
一般执行上面三个步骤就完成了mod模块化管理,但其实很多时候并没有这么顺利,基本遇到的问题都是网络代理的问题
最后
文章 只是很粗略的介绍了下基本使用,详细内容可参考知乎大神的帖子https://zhuanlan.zhihu.com/p/82109036
有疑问加站长微信联系(非本文作者)