非零基础自学Golang
第8章 包管理
8.6 包的命名
每个包都有一个包名,包名一般是短小的名字,在包的声明处指定。
通常来说,默认的包名就是包导入路径名的最后一段,因此即使两个包的导入路径不同,它们依然可能有一个相同的包名。
包的命名有如下规则:
- 第一条规则,同目录下的源码文件的代码包声明语句要一致。也就是说,它们要同属于一个代码包。这对于所有源码文件都是适用的。
- 第二条规则,源码文件声明的代码包的名称可以与其所在的目录的名称不同(import后面的最后一个元素是路径,即目录,并非包名)。如当前目录名为project1,但包名可以为main,或者为mypkg。
package main
package mypkg
8.7 依赖包管理
在Go语言开发过程中,我们经常会使用很多第三方的依赖包,如GitHub的第三方包。
当第三方包做了不兼容升级,仅通过GOPATH来管理依赖包会产生严重的问题,如果我们升级了依赖包,则会严重影响我们的项目。因此在1.5版本以前,为了规避这个问题,通常会将当前使用的依赖包拷贝出来。
为了解决这个问题,Go在1.5版本引入了vendor属性(默认关闭,需要设置Go环境变量GO15VENDOREXPERIMENT=1),并在1.6版本中默认开启了vendor属性。
其实现在的1.19.3 已经找不到了
简单来说,vendor属性就是让Go在编译时,优先从项目源码树根目录下的vendor目录查找代码(可以理解为GOPATH),如果vendor中有,则不再去GOPATH中查找。
然而,有时候依赖包多了,逐个拷贝是非常费时费力的,因此在Go 1.11之后,官方发布了支持的版本管理工具mod。
使用go mod命令即可运行mod工具。 【嗦嘎!!!终于看到你了】
mod支持如下命令:
download 下载依赖的module到本地cache
edit 编辑go.mod文件
graph 打印模块依赖图
init 在当前文件夹下初始化一个新的module,创建go.mod文件
tidy 增加丢失的module,去掉未用的module
vendor 将依赖复制到vendor下
verify 校验依赖
why 解释为什么需要依赖
当需要将所有外部依赖拷贝到vendor目录下时,只需要运行一条命令即可:
go mod vendor
对于低于Go 1.11的版本,可以使用第三方工具实现,这里推荐使用govendor进行依赖项管理。使用go get命令安装govendor:
go get -u github.com/kardianos/govendor
govendor主要提供了如下命令:
init 初始化vendor目录
list 列出所有的依赖包
add 加包到vendor目录,如govendor add +external添加所有外部包
add PKG_PATH 添加指定的依赖包到vendor目录
update 从$GOPATH更新依赖包到vendor目录
remove 从vendor管理中删除依赖
status 列出所有缺失、过期和修改过的包
fetch 添加或更新包到本地vendor目录
sync 本地存在vendor.json时拉取依赖包,匹配所记录的版本
get 类似go get目录,拉取依赖包到vendor目录
govendor生成vendor目录的时候需要两条命令:
govendor init 生成vendor/vendor.json,此时文件中只有本项目的信息
govendor add +external 更新vendor/vendor.json,并拷贝GOPATH下的代码到vendor目录中
其中命令“govendor add +external”也可以简写为“govendor add +e”。