社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
https://github.com/golang/go/wiki/Modules#quick-start
track tools/tooling updates to support modules
https://github.com/golang/go/issues/24661
Go 1.5 Release之前
使用GOPATH,包管理、项目代码都依赖于GOPATH,项目代码位于GOPATH的src文件夹之下;
Go 1.5 Release到Go 1.10 Release
使用vender目录来管理包依赖(Go 1.5需要配置,Go 1.6及之后默认打开);
查找依赖包路路径的解决⽅方案如下:
常⽤用的依赖管理工具
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,不需要设置了。
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
文件来指定以来版本
GO111MODULE=auto
go.mod
文件来确定是否使用module-mode;GOPRIVATE
GOPRIVATE
配置私有库或项目的地址。go env -w GOPRIVATE=*.corp.com,github.com/secret/repo
GOPROXY
GOSUMDB
1.go get
go get -u
(没有参数)下载、更新当前包下 直接和间接的依赖的最新版本,并不会更新整个项目。go get -u ./...
下载、更新当前项目根目录下直接或间接的依赖的最新版本,但是会排除测试包的依赖;例如将v1.2.1更新为v2.0.1go get -u=patch ./...
下载、更新当前项目根目录下直接或间接的依赖的大版本的最新小版本,例如,将v1.2.1更新为v1.2.5go get -u -t ./...
和go get -u ./...
相似,但是会更新测试包的依赖go get -d
只执行下载动作,而不执行安装动作;不再支持go get -m
,使用go get -d
替代。go list
go list -m all
列出当前项目build时需要使用直接或间接依赖的版本。 (details)go list -u -m all
不仅会列出当前使用模块的版本,还会列出当前使用模块的最新小版本和最新版本。 (details)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
记录的依赖信息是否正确go.mod
文件位于module-mode的go项目根目录下,用于定义项目名称、管理项目依赖。 module-mode的go项目可以位于GOPATH路径之外(go1.13强制). go.mod
包含四种指令: module, require, replace, exclude。
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
排除不需要的依赖用于校验本地下载的依赖模块是否正确,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=
go.mod
import "[moudle名称]/[包所在文件在项目中的相对路径]"
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!