背景
在go中,模块或者库的拉取通常是使用的git,所以,有时候会出现拉取失败的请况
- 通常我们自己的代码可能是在自己的私有代码仓库,当我们需要拉取自己私有仓库中的模块的时候,会发现无法拉取
- 在公共代码仓库中的模块或者库是私有的,拉取时,会报无法找到
解决
这里需要依赖三个go中的环境变量
GOPRIVATE
GONOPROXY
GONOSUMDB
GOPRIVATE
GOPRIVATE
是 Go 中一个非常重要的环境变量,用于控制私有模块的行为。
它的作用是告诉 Go 工具链,哪些模块是私有的,从而跳过对这些模块的校验和验证(GOSUMDB
)和代理下载(GOPROXY
)。
作用
- 跳过校验和验证:
- Go 默认会通过
sum.golang.org
验证模块的校验和。 - 对于私有模块,
sum.golang.org
无法访问,因此需要跳过校验和验证。
- Go 默认会通过
- 跳过代理下载:
- Go 默认会通过
GOPROXY
下载模块。 - 对于私有模块,你可能希望直接从源代码仓库(如 Git)下载,而不是通过代理。
- Go 默认会通过
- 提高私有模块的访问效率:
- 设置
GOPRIVATE
后,Go 会直接访问私有模块的源代码仓库,避免不必要的代理和校验步骤。
- 设置
取值
- 默认值:空(即所有模块都通过
GOPROXY
和GOSUMDB
处理)。 - 设置值:
- 可以是一个逗号分隔的模块路径列表。
- 支持通配符
*
,例如*.corp.example.com
表示所有以corp.example.com
结尾的模块。
设置
方法一:通过命令行设置
go env -w GOPRIVATE=gitee.com/aaa/abc,*.corp.example.com
方法二:通过环境变量设置
在终端中直接设置环境变量:
- Linux/macOS:
export GOPRIVATE=gitee.com/aaa/abc,*.corp.example.com
- Windows:
setx GOPRIVATE gitee.com/aaa/abc,*.corp.example.com
使用场景
- 私有模块:
- 如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),需要设置
GOPRIVATE
。
- 如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),需要设置
- 本地开发模块:
- 如果你在本地开发模块并希望直接使用本地路径,可以将其添加到
GOPRIVATE
中。
- 如果你在本地开发模块并希望直接使用本地路径,可以将其添加到
- 自定义模块路径:
- 如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到
GOPRIVATE
中。
- 如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到
示例
假设你有一个私有模块托管在 gitee.com/aaa/abc
,你可以通过以下方式设置 GOPRIVATE
:
go env -w GOPRIVATE=gitee.com/aaa/abc
或者设置所有 gitee.com
的模块为私有:
go env -w GOPRIVATE=gitee.com
注意事项
- 与
GONOPROXY
和GONOSUMDB
的关系:- 设置
GOPRIVATE
后,Go 会自动将这些模块添加到GONOPROXY
和GONOSUMDB
中。 - 因此,通常不需要单独设置
GONOPROXY
和GONOSUMDB
。
- 设置
- 恢复默认值:
如果你想恢复GOPRIVATE
的默认值,可以运行:go env -u GOPRIVATE
- 安全性:
- 设置
GOPRIVATE
后,Go 会跳过对这些模块的校验和验证,因此需要确保这些模块的来源是可信的。
- 设置
总结
GOPRIVATE
用于指定私有模块路径,跳过校验和验证和代理下载。- 适用于私有模块、本地开发模块或自定义模块路径。
- 设置后,Go 会自动处理这些模块的访问逻辑。
GONOSUMDB
在 Go 中,GONOSUMDB
是一个用于控制 Go 模块校验和验证的环境变量。
它的作用是告诉 Go 工具链,哪些模块不需要通过公共校验和数据库(sum.golang.org
)进行校验和验证。
作用
Go 模块系统默认会从 sum.golang.org
下载模块的校验和,以确保模块的完整性和安全性。
然而,对于私有模块或无法访问 sum.golang.org
的模块,这种校验和验证可能会导致问题。
通过设置 GONOSUMDB
,你可以指定哪些模块不需要进行校验和验证。
取值
- 默认值:空(即所有模块都需要校验和验证)。
- 设置值:
- 可以是一个逗号分隔的模块路径列表。
- 支持通配符
*
,例如*.corp.example.com
表示所有以corp.example.com
结尾的模块。
使用场景
- 私有模块:
如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),且无法通过sum.golang.org
进行校验和验证,可以通过GONOSUMDB
跳过这些模块的校验。 - 离线环境:
在无法访问sum.golang.org
的环境中(如内网开发环境),可以禁用校验和验证。 - 自定义模块路径:
如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到GONOSUMDB
中。
设置
方法一:通过命令行设置
go env -w GONOSUMDB=example.com,*.corp.example.com
方法二:通过环境变量设置
在终端中直接设置环境变量:
- Linux/macOS:
export GONOSUMDB=example.com,*.corp.example.com
- Windows:
setx GONOSUMDB example.com,*.corp.example.com
示例
假设你有一个私有模块托管在 gitee.com/abc/ccc
,你可以通过以下方式跳过校验和验证:
go env -w GONOSUMDB=gitee.com/abc/ccc
或者跳过所有 gitee.com
的模块:
go env -w GONOSUMDB=gitee.com
注意事项
-
安全性:
禁用校验和验证会降低模块的安全性,因为 Go 无法验证模块的完整性。请确保你信任这些模块的来源。 -
与
GOPRIVATE
的关系:GOPRIVATE
用于指定私有模块路径,同时也会隐式地将这些模块添加到GONOSUMDB
中。- 如果你已经设置了
GOPRIVATE
,通常不需要额外设置GONOSUMDB
。
-
恢复默认值:
如果你想恢复GONOSUMDB
的默认值,可以运行:go env -u GONOSUMDB
总结
GONOSUMDB
用于跳过指定模块的校验和验证。- 适用于私有模块或无法访问
sum.golang.org
的场景。 - 设置时需注意安全性,确保模块来源可信。
GONOPROXY
在 Go 中,GONOPROXY
是一个用于控制 Go 模块代理行为的环境变量。
它的作用是告诉 Go 工具链,哪些模块不应该通过配置的模块代理(如 GOPROXY
)下载,而是直接从版本控制系统(如 Git、SVN 等)获取。
作用
Go 模块系统默认会通过 GOPROXY
下载模块。
然而,对于某些模块(如私有模块或本地开发模块),你可能希望绕过代理,直接从源代码仓库下载。GONOPROXY
就是用来指定这些模块的。
取值
- 默认值:空(即所有模块都通过
GOPROXY
下载)。 - 设置值:
- 可以是一个逗号分隔的模块路径列表。
- 支持通配符
*
,例如*.corp.example.com
表示所有以corp.example.com
结尾的模块。
使用场景
-
私有模块:
如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),且无法通过公共代理(如proxy.golang.org
)下载,可以通过GONOPROXY
绕过代理。 -
本地开发模块:
如果你在本地开发模块并希望直接使用本地路径,而不是通过代理下载,可以将其添加到GONOPROXY
中。 -
自定义模块路径:
如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到GONOPROXY
中。
设置
方法一:通过命令行设置
go env -w GONOPROXY=example.com,*.corp.example.com
方法二:通过环境变量设置
在终端中直接设置环境变量:
- Linux/macOS:
export GONOPROXY=example.com,*.corp.example.com
- Windows:
setx GONOPROXY example.com,*.corp.example.com
示例
假设你有一个私有模块托管在 gitee.com/abc/ccc
,你可以通过以下方式绕过代理:
go env -w GONOPROXY=gitee.com/abc/ccc
或者绕过所有 gitee.com
的模块:
go env -w GONOPROXY=gitee.com
注意事项
-
与
GOPRIVATE
的关系:GOPRIVATE
用于指定私有模块路径,同时也会隐式地将这些模块添加到GONOPROXY
和GONOSUMDB
中。- 如果你已经设置了
GOPRIVATE
,通常不需要额外设置GONOPROXY
。
-
恢复默认值:
如果你想恢复GONOPROXY
的默认值,可以运行:go env -u GONOPROXY
-
代理配置:
确保GOPROXY
配置正确。例如,常用的代理配置是:go env -w GOPROXY=https://mirrors.huaweicloud.com/repository/goproxy/
总结
GONOPROXY
用于指定哪些模块不应该通过代理下载。- 适用于私有模块或需要直接从版本控制系统下载的场景。
- 通常与
GOPRIVATE
一起使用,但也可以单独设置。
私有模块的拉取
配置了上面两个,如果是公开的模块,那就可以拉取了
如果是私有的模块,那就无法拉取,会报错
go: module gitee.com/abc/ccc: git ls-remote -q origin in C:\Go\go\pkg\mod\cache\vcs\95f299bacaa817db5e2ac0e29ef6eb3dec51f2293e970e55dc07d59123c4745c: exit status 128:
fatal: Cannot prompt because user interactivity has been disabled.
bash: line 1: /dev/tty: No such device or address
error: failed to execute prompt script (exit code 1)
fatal: could not read Username for 'https://gitee.com': No such file or directory
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
解决,可以参考 https://golang.org/doc/faq#git_https
在 $HOME
目录下创建文件 .netrc
写入
machine 仓库域名 login 用户名 password 私人令牌
私人令牌可在自己的代码仓库中获取
设置示例
machine gitee.com login abc password xxxxxxxxxxxxxxxxxxxxxxxxxx
然后基本上就可以拉取了
标签:模块,Get,私有,GONOSUMDB,GOPRIVATE,Go,com,example From: https://www.cnblogs.com/guangdelw/p/18687793