Go Modules
Go 1.11 开始出现了内置的模块化机制, 但是需要通过设置环境变量 GO111MODULE=on
手动开启, Go 1.13 及之后默认启用.
可以通过命令 go help modules
获取模块相关的信息, 都是英文介绍.
模块命令
随之而来的是 Go CLI 中提供了一个新的子命令 go mod
.
go mod
命令介绍如下:
> go mod
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
Usage:
go mod <command> [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
Use "go help mod <command>" for more information about a command.
命令释意如下:
命令 | 说明 |
---|---|
download | 下载模块到本地缓存中, 以便后续使用 |
edit | 通过工具或脚本编辑 go.mod 文件 |
graph | 打印各模块之间的依赖关系图 |
init | 在当前目录初始化一个新模块,会生成 go.mod 文件 |
tidy | 添加缺失的模块并移除无用的模块 |
vendor | 在项目中创建 vendor 目录, 并将依赖包拷贝到该目录 |
verify | 验证依赖的模块是否正确 |
why | 解释了为什么需要包或模块 |
代理服务
这里不得不说一下 goproxy, 因为某些不可描述的原因, 在国内访问/下载一些依赖包时, 总是会超时或失败.
于是有了代理服务, 也就是 goproxy.
下面记录一些挺好使的代理服务.
注: 一个好使的代理服务, 模块下载速度嗷嗷的, 能够非常直观的提升编程体验.
设置代理
Go 中可以通过修改环境变量 GOPPROXY 的值来指定使用哪个代理服务.
这里提供几种修改 GOPROXY 的方式.
Go 1.13+(推荐)
go env 命令是 go 内置的一个编辑 go 环境变量的工具, 可以非常方便的调整相关的环境变量.
go env -w GOPROXY=https://goproxy.io,direct
Windows
打开 PowerShell 并执行以下命令:
$env:GOPROXY = "https://goproxy.io"
# 或者通过 GUI 方式手工设置环境变量 GOPROXY=https://goproxy.cn
Linux/macOS
export GOPROXY=https://goproxy.io
# 或者
echo "export GOPROXY=https://goproxy.io" >> ~/.profile && source ~/.profile
使用
Go 模块化不在强依赖 GOPATH, 不用再严格遵循 src/pkg/bin 这样的路径结构, 可以在任何目录下创建任意项目, 灵活性大大提升.
# 创建一个叫做 xxx 模块
mkdir xxx
# 使用 go mod init 命令初始化该模块
go mod init github.com/taadis/xxx
# 若创建成功会输出以下内容
go: creating new go.mod: module github.com/taadis/xxx
# 同时会自动生成一个 go.mod 文件, 内容如下:
module github.com/taadis/xxx
go 1.13
查看某个库的可用版本
go list -m -versions github.com/google/uuid
# 将列出如下内容
github.com/google/uuid v1.0.0 v1.1.0 v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.1.5 v1.2.0 v1.3.0
首次下载或更新依赖到某个版本
go get github.com/google/uuid@v1.3.0
更新到某个最新小版本,补丁版
go get -u=patch github.com/google/uuid
通常我们会在某个特性分支开发一些东西, 需要切换依赖到某个特性分支的
go get github.com/taadis/xxx feature/xxx
清理 go mod 本地缓存
go clean -modcache
包下载后会在本机的 %GOPATH%\go\pkg\mod
目录下, 具体的 %GOPATH%
可以通过命令 go env GOPATH
获得.
私有库
大多数情况下, github 等代码托管平台上的公有库可以满足我们大多数场景的需求, 但是对于一些内部代码需要私有库的需求, 可以通过以下操作满足.
# 设置 GOPRIVATE
go env -w GOPRIVATE="https://github.com/taadis"
在 github 上获取你的 Personal access tokens
在本地 git 中添加配置
git config --global url."https://${username}:${access_token}@github.com".insteadOf /
"https://github.com"
参考