非零基础自学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”。