1、Golang依赖管理经历的三个时期
1.1、GOPATH时期
优点:简单。
缺点:
1. 无法进行依赖版本管理。
2. 两个项目依赖相同包的不同版本则无法使用同一个GOPATH。
1.2、vender时期(依赖包私有化)
优点:
1. 项目发布时可以把依赖软件一并发布,编译不受GOPATH影响。
缺点:
1. 依赖版本不易管理。项目依赖不清晰,版本升级审核困难,依赖包版本之间可能存在冲突等。
1.3、Go Module时期(最终形态)
优点:
1. 能够准确地记录项目依赖的版本
2. 可重复的构建
2、安装Golang
wget https://go.dev/dl/go1.16.10.linux-amd64.tar.gz
# 如果已经安装过Golang建议备份旧版本,方便需要的时候随时切换版本
# e.g: mv /usr/local/go /usr/local/go1.15-bak
tar -C /usr/local -xzf go1.16.10.linux-amd64.tar.gz
export GOROOT=/usr/local/go
export PATH=$PATH:/usr/local/go/bin
mkdir ~/go
# Go1.8起默认把$HOME/go作为GOPATH目录
export GOPATH=$HOME/go
3、Go Module介绍
一个项目要使用Go Module,那么其本身要先成为一个module,即需要一个module名字。
go mod init
一共有四个指令
- module:声明module的名称
- require:声明依赖及其版本号
- replace:替换require中声明的依赖,使用另外的依赖及其版本号
- exclude:禁用指定的依赖
4、Golang相关环境变量介绍
GOROOT(Go安装目录)
Go语言安装的位置,其中存放Go编译器和Go标准库。
GOPATH(Go工作空间)
GOPATH环境变量指向用户域,每个用户都拥有自己的工作空间而互不干扰。工作空间中存放第三方库和私有库。
GO111MODULE
从1.16版本开始,GO111MODULE默认为on
GOSUMDB
参考:https://goproxy.io/zh/docs/GOSUMDB-env.html
如果你的代码仓库或者模块是私有的,那么它的校验值不应该出现在互联网的公有数据库里面,但是我们本地编译的时候默认所有的依赖下载都会去尝试做校验,这样不仅会校验失败,更会泄漏一些私有仓库的路径等信息,我们可以使用 GONOSUMDB 这个环境变量来设置不做校验的代码仓库,它可以设置多个匹配路径,用逗号相隔。举个例子:
export GONOSUMDB=*.corp.example.com,rsc.io/private
这样的话,像 “git.corp.example.com/xyzzy”, “rsc.io/private”, 和 “rsc.io/private/quux”这些公司和自己的私有仓库就都不会做校验了。
GOPROXY
# Golang官方源
export GOPROXY=https://proxy.golang.org,direct
# 当前由七牛云维护的Golang源
export GOPROXY=https://goproxy.cn,direct
# 国内最早Golang代理源
export GOPROXY=https://goproxy.io,direct
(说明:GOPROXY尾部的 ,direct
表示如果代理服务器无法响应(HTTP返回码为404、401除外),则不再继续尝试后续的代理服务器。)
5、Golang相关命令介绍
https://go.dev/ref/mod#go-install
go get
获取最新版本或指定版本的依赖软件包并自动更新 go.mod
文件,使该软件包的版本升级为当前指定的版本。
# Upgrade a specific module.
$ go get -d golang.org/x/net
# Upgrade modules that provide packages imported by packages in the main module.
$ go get -d -u ./...
# Upgrade or downgrade to a specific version of a module.
$ go get -d golang.org/x/text@v0.3.2
# Update to the commit on the module's master branch.
$ go get -d golang.org/x/text@master
# Remove a dependency on a module and downgrade modules that require it
# to versions that don't require it.
$ go get -d golang.org/x/text@none
(重要:参数 -d
表示只会下载此依赖包的源码而不会构建安装,此参数在未来 Go 版本中将会成为默认值。)
go install
用于构建和安装软件包。指定具体版本时忽略当前目录下的 go.mod
文件,未指定版本时优先采用当前目录下 go.mod
文件中指定的版本。
# Install the latest version of a program,
# ignoring go.mod in the current directory (if any).
$ go install golang.org/x/tools/gopls@latest
# Install a specific version of a program.
$ go install golang.org/x/tools/gopls@v0.6.4
# Install a program at the version selected by the module in the current directory.
$ go install golang.org/x/tools/gopls
# Install all programs in a directory.
$ go install ./cmd/...
go mod tidy
go mod tidy
确保 go.mod
文件与模块中的源代码匹配。 它添加了构建当前模块的包和依赖项所需的任何缺失的模块要求,并删除了对不提供任何相关包的模块的要求。 它还会将任何缺失的条目添加到 go.sum
并删除不必要的条目。
go mod init
在当前目录中初始化并写入一个新的 go.mod
文件,实际上创建了一个以当前目录为根的新 Module。
go mod init
go mod init example.com/m
go build
go test
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com