go mod 和 govendor 都是 Go 包管理器,类似 Java 工程的 maven
有这么个故事
Vendor目录是Golang从1.5版本开始引入的,为项目开发提供了一种离线保存第三方依赖包的方法。但是到了Golang 1.11之后,由于引入了Module功能,在运行go build时,优先引用的是Module依赖包的逻辑,所以Vendor目录就被“无视”了,进而可能发生编译错误, moudle 说还是很想他,于是 提供了 go mod vendor 命令用来生成 vendor 目录。这样能避免一些编译问题,依赖可以先从 vendor 目录进行扫描。
$ go mod help vendor
usage: go mod vendor [-v]
Vendor resets the main module's vendor directory to include all packages needed to build and test all the main module's packages.
It does not include test code for vendored packages.
这句话的意思是:把 go mod init 后下载的相关依 赖包(Gopath 的 pkg) 目录,拷贝到 vendor 目录。
go vendor 是go 1.5 官方引入管理包依赖的方式
基本思路: 将引用的外部包的源代码放在当前工程的vendor目录下面,go 1.6以后编译go代码会优先从vendor目录先寻找依赖包;找不到再从GOPATH 中寻找
将源码拷贝到当前目录下,这样导包当前工程代码到任意的机器的 ¥GOPATH/src 都可以编译通过,避免项目代码外部依赖过多
无法精确的引用 外部包进行版本控制,不能指定引用某个特定版本的外部包,只是在开发时将其拷贝过来,但是一旦外部包升级,vendor 下面的包会跟着升级,而且 vendor 下面没有完整的引用包的版本信息, 对包升级带来了无法评估的风险。
govendor add inport_out_packagename
vendor.json
goverdor --list
goverdor --list -v
govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具。与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本、以及无相互侵入的开发和管理。
在执行 go build 或 go run 命令时,会按照以下顺序去查找包:
状态参数
go get -u -v github.com/kardianos/govendor
cd xxx
govendor init
初始化完成后,项目目录中会生成一个vendor文件夹,包含一个vendor.json文件,json文件中包含了项目所依赖的所有包信息
{
"comment": "",
"ignore": "test",
"package": [],
"rootPath": "govendor-example"
}
govendor add +external
govendor add gopkg.in/yaml.v2
govendor list
运行结果
e github.com/gin-contrib/sse
e github.com/gin-gonic/gin
e github.com/gin-gonic/gin/binding
e github.com/gin-gonic/gin/internal/json
e github.com/gin-gonic/gin/render
e github.com/golang/protobuf/proto
e github.com/mattn/go-isatty
e github.com/ugorji/go/codec
e gopkg.in/go-playground/validator.v8
e gopkg.in/yaml.v2
pl govendor-example
m github.com/json-iterator/go
m golang.org/x/sys/unix
govendor list -v fmt
s fmt
├── e github.com/gin-contrib/sse
├── e github.com/gin-gonic/gin
├── e github.com/gin-gonic/gin/render
├── e github.com/golang/protobuf/proto
├── e github.com/ugorji/go/codec
├── e gopkg.in/go-playground/validator.v8
├── e gopkg.in/yaml.v2
└── pl govendor-example
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
包不再保存在GOPATH中,而是被下载到了$GOPATH/pkg/mod路径下.
go mod vendor 会将依赖包放到 vendor 目录
在这里插入图片描述
module github.com/Q1mi/studygo/blogger
go 1.12
require (
github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
github.com/gin-gonic/gin v1.4.0
github.com/go-sql-driver/mysql v1.4.1
github.com/jmoiron/sqlx v1.2.0
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
在这里插入图片描述
在这里插入图片描述
微信号:程序员开发者社区
博客:CSDN 王小明
关注我们,了解更多