Go的包管理方式的演进
- 最初的go所有的包都放在GOPATH的目录下,采用namespace的方式来区分包路径
- 从go1.5开始引入了vendor的包管理模式,项目中存在vendor目录的话,go的工具链会优先使用vendor下的包进行编译,govendor, go dep等社区的包管理工具就是通过这种方式实现的
- go1.11开始,官方推出了go module作为官方的包管理方式,最初的Go module提案是vgo,不过gomod在go v11跟v12版本并不是默认打开的,需要通过环境变量来启用
Go module概念
go module抛弃了GOPATH的管理方式,引入了 模块(module)概念,一个Go模块是一组包(package)的集合,它们有着共同的版本信息, 模块里记录了准确的依赖关心信息,可以被重复的构建
一个模块在go项目中的根目录上生成go.mod文件,go.mod包含四个指令 module, require, replace exclude
module code.byted.org/aweme/gomix
require (
code.byted.org/aweme-go/bcache v0.0.0-20190816025257-cb327e85ee8a
code.byted.org/data/databus_client v1.2.1 // indirect
code.byted.org/golf/buffer_pool v0.0.0-20151120123746-3d60c9c70330 // indirect
)
- Module 表明当前模块名称
- Require 模块的依赖信息,包含直接、间接的依赖
- Replace 指定依赖(后者)去代替前者
- Exclude 用来忽略某些特定版本
go.mod & go.sum
Go.mod 记录了当前项目使用的第三方包,包名、版本号等关键信息
Go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,Go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。
启用 go mod
我们可以用环境变量GOMODULE来开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
off: 项目需要在GOPATH下管理,go会从vendor -> gopath去管理包
auto: 项目如果在GOPATH下,则参照off的方式查找,否则直接根据go.mod方式管理
on: 不管项目是否在GOPATH内,都使用go module的方式管理包
go mod常用命令
go mod init 在当前目录初始化module
go mode tidy 移除项目中未使用的依赖,新增需要的依赖,不会改变模块的版本
go mod vendor 当依赖copy到 vendor目录下
go mod why 查看项目中为什么依赖某个包或者模块
go mod graph 查看模块的依赖图
如何使用go module
初始化
$ > go mod init
在任意目录下,新建你的项目,然后执行 go mod init ${repo}
repo为模块的远程路径(repo=code.byted.org/aweme/gomix)执行完之后会生成 go.mod, go.sum二个模块管理的文件
添加&升级 依赖
>$ go get package
当你使用mod来管理包时,go get会自动下载安装package并且更新到版本信息到go mod文件中
go mod使用本地依赖包
很多时候我们在开发A repo时,依赖了 B repo,此时B也在开发中,由于go mod把依赖都下载到了$GOPATH/pkg/mod下,如果直接把B的代码切一个分支提交再go get下来,太蠢了 :(
使用replace指令将某个包指向另一个包或者是地址,愉快的开发调试吧
ps: replace指令中替换成的包需要有go.mod文件
module code.byted.org/aweme/gomix
require (
code.byted.org/aweme-go/bcache v0.0.0-20190816025257-cb327e85ee8a
code.byted.org/data/databus_client v1.2.1 // indirect
code.byted.org/golf/buffer_pool v0.0.0-20151120123746-3d60c9c70330 // indirect
code.byted.org/golf/logger v0.0.0-20160929064355-0a0db464847e // indirect
code.byted.org/golf/metrics v0.0.0-20180319090601-41e3be1d73e4 // indirect
)
replace code.byted.org/gopkg/gorm => /User/name/go/src/xxx/
go mod管理之后,依赖包放在哪,还是GOPATH么?
依赖的第三方包会被下载到 $GOPATH/pkg/mod
路径下