Golang依赖管理

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
github