Go Modules - Go语言中文社区

Go Modules


1. go modules 文档

https://github.com/golang/go/wiki/Modules#quick-start
track tools/tooling updates to support modules
https://github.com/golang/go/issues/24661

2. go版本控制发展

Go 1.5 Release之前
使用GOPATH,包管理、项目代码都依赖于GOPATH,项目代码位于GOPATH的src文件夹之下;
Go 1.5 Release到Go 1.10 Release
使用vender目录来管理包依赖(Go 1.5需要配置,Go 1.6及之后默认打开);
查找依赖包路路径的解决⽅方案如下:

  1. 当前包下的 vendor ⽬目录
  2. 向上级⽬目录查找,直到找到 src 下的 vendor ⽬目录
  3. 在 GOPATH 下⾯面查找依赖包
  4. 在 GOROOT ⽬目录下查找

常⽤用的依赖管理工具
godep https://github.com/tools/godep
glide https://github.com/Masterminds/glide
dep https://github.com/golang/dep

Go 1.11 Release到Go 1.13 Release
使用go modules模块(module-mode)进行依赖管理,在go1.11与go1.12要设置环境变量GO111MODULE=auto启用module-mode;在go1.13中GO111MODULE=auto为默认设置,即默认启用module-mode,不需要设置了。

3. go modules介绍

go modules从go 1.11提出,需要配置环境变量GO111MODULE=auto启用,go 1.13默认启用,用于go项目的依赖管理。当编译、运行go项目时,若发现后缀有.mod文件时即启用module-mode来编译、运行项目。
使用module-mode后,项目目录不再需要放置于GOPATH/src目录下了(go1.13及其之后,使用module-mode的项目目录强制不能位于GOPATH目录之内)。
go moudles功能
1.自动添加import声明,如果.go文件中需要的模块;
2.根据代码中import声明,go中的标准命令(go build,go run,go test等)会自动下载合适的依赖,并更新go.mod文件;
3.通过命令go get [moduleName] @[moduleVersion](列如,go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2)来指定项目中所依赖的模块具体版本,也可以通过编辑go.mod文件来指定以来版本

4. go modules相关配置

  1. GO111MODULE=auto
    启用module-mode,即使用go modules管理项目依赖;go1.11,go1.12需要在环境变量中配置,go1.13为默认配置(并且禁止使用module-mod的项目目录存放在GOPATH下)。
    GO111MODULE 环境变量:
  • auto 或者不设置—默认设置,会根据执行命令的目录是否有go.mod文件来确定是否使用module-mode;
  • on — 执行命令的目录强制使用moudle-mode;
  • off — 执行命令的目录强制不使用moudle-mode;
  1. GOPRIVATE
    如果需要使用自己或公司的私有代码库,则需要使用GOPRIVATE配置私有库或项目的地址。
    例如:
    go env -w GOPRIVATE=*.corp.com,github.com/secret/repo
  2. GOPROXY
    设置默认下载依赖的公有Go模块镜像的代理地址,默认为https://proxy.golang.org;其它的代理地址(国内科学上网)可以查看(details
  3. GOSUMDB
    设置与本地下载的go依赖进行对比校验的公共校验数据库代理地址,默认为 https://sum.golang.org

5. go modules指令

1.go get

  • go get -u (没有参数)下载、更新当前包下 直接和间接的依赖的最新版本,并不会更新整个项目。
  • go get -u ./...下载、更新当前项目根目录下直接或间接的依赖的最新版本,但是会排除测试包的依赖;例如将v1.2.1更新为v2.0.1
  • go get -u=patch ./...下载、更新当前项目根目录下直接或间接的依赖的大版本的最新小版本,例如,将v1.2.1更新为v1.2.5
  • go get -u -t ./...go get -u ./...相似,但是会更新测试包的依赖
  • go get -d 只执行下载动作,而不执行安装动作;不再支持go get -m ,使用go get -d替代。
  1. go list
  • go list -m all 列出当前项目build时需要使用直接或间接依赖的版本。 (details)
  • go list -u -m all 不仅会列出当前使用模块的版本,还会列出当前使用模块的最新小版本和最新版本。 (details)
  1. go build ./... 构建当前项目 (details)

  2. go test ./... 执行当前项目下的测试 (details)

  3. go mod

  • go mod tidy 删除不必要的依赖,添加OS, architecture, and build tags组合所需要的依赖。 (details)
  • go mod vendor 可选步骤,用于建立vendor文件夹,用于vendor机制的包管理(details)
  • go mod init 将go项目初始化成module-mode,使用go modules进行依赖管理。
  • go mod verify 校验go.sum记录的依赖信息是否正确

6. go.mod与与go.sum

6.1 go.mod

go.mod文件位于module-mode的go项目根目录下,用于定义项目名称、管理项目依赖。 module-mode的go项目可以位于GOPATH路径之外(go1.13强制). go.mod包含四种指令: module, require, replace, exclude。

  • module标识了项目的身份,提供了项目路径。
    module也作为项目中包引用的前缀,若项目的文件结构如下
repo
|-- bar
|   `-- bar.go
|-- foo
|   `-- foo.go
`-- go.mod

若在包中想引用foo模块,只需使用import "[moudle的值]/foo"即可

  • require 标识引用的依赖和版本,例如
require (
    rsc.io/quote v1.5.0
)
  • replace 可以用本地的依赖替代线上的依赖,比如说A项目依赖于B项目,而B项目还未上传到云端,可以先依赖本地的B项目,等B开发完成后删除replace就可以依赖云端的,例如
require (
    [B项目云端路径] v1.5.0
)
replace [B项目云端路径]  => [B项目本地文件夹路径]
  • exclude 排除不需要的依赖

6.2 go.sum

用于校验本地下载的依赖模块是否正确,go.sum中会记载依赖模块的名称、版本、hash值,用于和云端校验数据库中相同名称、版本的模块的hash值做对比。hash值的前缀是h<N>:,则标识计算hash值的算法为SHA-256。
go.sum文件格式如下:

rsc.io/quote v1.5.0 h1:mVjf/WMWxfIw299sOl/O3EXn5qEaaJPMDHMsv7DBDlw=
rsc.io/quote v1.5.0/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=

7. go moudles需要注意的地方

  • 在项目根目录下生成go.mod
  • 项目中的包引用使用import "[moudle名称]/[包所在文件在项目中的相对路径]"
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/81eaf00f1e3b
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-07 22:11:41
  • 阅读 ( 1439 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢