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"

参考

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
taadis
讨论数量: 0
发起讨论 只看当前版本


暂无话题~