golang 使用私有仓库模块

35

注:以下方法在阿里云 codeup 上测试可用,其他私有仓库仅供参考

使用 https 访问私有仓库

GOPRIVATE 环境变量

首先,通过调整 GOPRIVATE 环境变量,告诉 go 的工具链,不要从公网代理(默认:proxy.golang.org)查找和下载模块,也不要再校验 sumdb

建议先检查 GOPRIVATE 是否已有配置,是的话需要设置多个,否则会覆盖掉原来的

go env -w GOPRIVATE=模块路径

此命令将配置写入到 ~/go/env 或高版本 go 在 ~/.config/go/env
这里的“模块路径”可以包含通配符 *,比如直接指定某个域名下的所有:example.com/*

netrc 鉴权

使用 .netrc 文件为 https 鉴权,文件位置 linux:~/.netrc,windows:~/_netrc

内容格式:

machine example.com login UserName password Password

注意:machine 字段只设置域名

然后使用 go get 命令就可以拉取了:

go get example.com/module
或
go get example.com/module/v2

还有一种不使用 .netrc 的方法,类似下面“ssh 访问私有仓库”,感觉影响面比较大,不建议使用:

git config --global url."https://<TOKEN>@example.com/".insteadOf "https://example.com/"

使用 ssh 访问私有仓库

暂未实践

首先配置 ssh 密钥到服务器上,然后修改本地 git 的配置,将所有 https:// 协议的请求自动修改为 ssh 的,但这种修改影响面比较大,以后如果想使用 https 的协议克隆仓库也会被 git 自动修改成 ssh 的协议

git config --global url."[email protected]:".insteadOf "https://github.com/"

注意,这种方法也需要修改 GOPRIVATE 环境变量

使用私有仓库替换依赖模块

目的是使用修改过的模块代码替换原依赖模块,同时保证应用代码里对原依赖模块的 import 语句不变,仍然是原来的模块路径,这需要使用 go mod 的 replace 功能,有两种方法:

  • 替换为本地代码目录
  • 访问私有仓库

首先添加原依赖模块到项目中,这会自动将原依赖模块的内部依赖处理好:

go get example.com/module

方法一:替换为本地代码目录

将修改后的模块代码克隆下载,放在上级目录下:../mymodule,然后执行替换:

go mod edit -replace=example.com/module=../mymodule

如果原依赖模块是 v2 及更高版本的需要加上模块版本:

go mod edit -replace=example.com/module/v2=../mymodule

缺点:这种方法看起来简单,但团队协作和修改后的模块的版本管理都存在问题,因为这种方法无法设置本地代码的 tag 版本

最后执行:

go mod tidy

方法二:结合“使用 https/ssh 访问私有仓库”的方法

将修改后的代码推送到私有仓库,并打出新的 tag,比如基于原本依赖模块 v1.0.0 版本修改后,就可以打出 v1.0.0-patch.1 的 tag

根据前文介绍处理好通过 https/ssh 访问私有仓库的配置

将依赖模块替换为线上私有仓库的指定版本:

go mod edit -replace=example.com/module=private.example.com/[email protected]

如果原依赖模块是 v2 及更高版本的需要加上模块版本:

go mod edit -replace=example.com/module/v2=private.example.com/module/[email protected]

最后执行:

go mod tidy