module 是一个相关Go包的集合,它是源代码更替和版本控制的单元。

1、Go mod 命令

  1. /*
  2. download download modules to local cache (下载依赖的module到本地cache))
  3. edit edit go.mod from tools or scripts (编辑go.mod文件)
  4. graph print module requirement graph (打印模块依赖图))
  5. init initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))
  6. tidy add missing and remove unused modules (增加丢失的module,去掉未用的module)
  7. vendor make vendored copy of dependencies (将依赖复制到vendor下)
  8. verify verify dependencies have expected content (校验依赖)
  9. why explain why packages or modules are needed (解释为什么需要依赖)
  10. */

Mod Cache 路径默认在$GOPATH/pkg 下面:$GOPATH/pkg/mod

2、go mod流程

同样是 mysite 项目,现在从 src 中剪到其他任何位置,会编译报错。用 go module来解决这个问题。

  1. 首先将你的版本更新到最新的Go版本(>= 1.11)
  2. 通过go命令行,进入到你当前工程目录下,在命令行设置临时环境变量 set GO111MODULE=on
  3. go mod init 在当前目录下生成一个 go.mod 文件,执行这条命令时,当前目录不能存在 go.mod文件(存在则删除)。
  1. go mod init xxx // xxx 即声明的模块名

该命令会在当前目录下生成 go.mod 文件,文件中声明了模块名称。

  1. module xxx
  2. go 1.16

以后相关依赖可以声明在这里,就像Python的 requirements。

  1. 执行 go mod tidy 命令,它会添加缺失模块以及移除不需要的模块。

执行后会生成 go.sum 文件(模块下载条目)。添加参数 -v,例如 go mod tidy -v 可以将执行信息,即删除和添加的包打印到命令行;将拉取的依赖存放到 GOPATH/pkg/mod 路径下。

  1. 执行 命令 go mod verify 来检查当前模块的依赖是否全部下载下来,是否下载下来被修改过。如果所有的的模块都没有被修改过,那么执行这条命令之后,会打印 all module verified。
  2. 执行命令 go mod vendor 生成 vendor 文件夹,该文件夹将会放置你的 go.mod 文件描述的依赖包,文件夹下同时还有一个文件 modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有 vendor目录,应该先进行删除。同理 go mod vendor -v 会将添加到vendor中的模块打印出来。

10.2、go module - 图1

内部包调用从初始化模块名 go.mod 所在的目录开始查找,所以导入 api 包:import “xxx/api”