Go中私有库的模块要如何Get呢

背景

在go中,模块或者库的拉取通常是使用的git,所以,有时候会出现拉取失败的请况

  1. 通常我们自己的代码可能是在自己的私有代码仓库,当我们需要拉取自己私有仓库中的模块的时候,会发现无法拉取
  2. 在公共代码仓库中的模块或者库是私有的,拉取时,会报无法找到

解决

这里需要依赖三个go中的环境变量

  • GOPRIVATE
  • GONOPROXY
  • GONOSUMDB

GOPRIVATE

GOPRIVATE 是 Go 中一个非常重要的环境变量,用于控制私有模块的行为。
它的作用是告诉 Go 工具链,哪些模块是私有的,从而跳过对这些模块的校验和验证(GOSUMDB)和代理下载(GOPROXY)。

作用

  1. 跳过校验和验证:
    • Go 默认会通过 sum.golang.org 验证模块的校验和。
    • 对于私有模块,sum.golang.org 无法访问,因此需要跳过校验和验证。
  2. 跳过代理下载:
    • Go 默认会通过 GOPROXY 下载模块。
    • 对于私有模块,你可能希望直接从源代码仓库(如 Git)下载,而不是通过代理。
  3. 提高私有模块的访问效率:
    • 设置 GOPRIVATE 后,Go 会直接访问私有模块的源代码仓库,避免不必要的代理和校验步骤。

取值

  • 默认值:空(即所有模块都通过 GOPROXYGOSUMDB 处理)。
  • 设置值:
    • 可以是一个逗号分隔的模块路径列表。
    • 支持通配符 *,例如 *.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
    

使用场景

  1. 私有模块:
    • 如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),需要设置 GOPRIVATE
  2. 本地开发模块:
    • 如果你在本地开发模块并希望直接使用本地路径,可以将其添加到 GOPRIVATE 中。
  3. 自定义模块路径:
    • 如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到 GOPRIVATE 中。

示例

假设你有一个私有模块托管在 gitee.com/aaa/abc,你可以通过以下方式设置 GOPRIVATE

go env -w GOPRIVATE=gitee.com/aaa/abc

或者设置所有 gitee.com 的模块为私有:

go env -w GOPRIVATE=gitee.com

注意事项

  1. GONOPROXYGONOSUMDB 的关系:
    • 设置 GOPRIVATE 后,Go 会自动将这些模块添加到 GONOPROXYGONOSUMDB 中。
    • 因此,通常不需要单独设置 GONOPROXYGONOSUMDB
  2. 恢复默认值:
    如果你想恢复 GOPRIVATE 的默认值,可以运行:
    go env -u GOPRIVATE
    
  3. 安全性:
    • 设置 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 结尾的模块。

使用场景

  1. 私有模块:
    如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),且无法通过 sum.golang.org 进行校验和验证,可以通过 GONOSUMDB 跳过这些模块的校验。
  2. 离线环境:
    在无法访问 sum.golang.org 的环境中(如内网开发环境),可以禁用校验和验证。
  3. 自定义模块路径:
    如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到 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

注意事项

  1. 安全性:
    禁用校验和验证会降低模块的安全性,因为 Go 无法验证模块的完整性。请确保你信任这些模块的来源。

  2. GOPRIVATE 的关系:

    • GOPRIVATE 用于指定私有模块路径,同时也会隐式地将这些模块添加到 GONOSUMDB 中。
    • 如果你已经设置了 GOPRIVATE,通常不需要额外设置 GONOSUMDB
  3. 恢复默认值:
    如果你想恢复 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 结尾的模块。

使用场景

  1. 私有模块:
    如果你的模块托管在私有仓库(如 GitHub Enterprise、GitLab 或 Gitee),且无法通过公共代理(如 proxy.golang.org)下载,可以通过 GONOPROXY 绕过代理。

  2. 本地开发模块:
    如果你在本地开发模块并希望直接使用本地路径,而不是通过代理下载,可以将其添加到 GONOPROXY 中。

  3. 自定义模块路径:
    如果你使用了自定义的模块路径(如公司内部的模块),可以将其添加到 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

注意事项

  1. GOPRIVATE 的关系:

    • GOPRIVATE 用于指定私有模块路径,同时也会隐式地将这些模块添加到 GONOPROXYGONOSUMDB 中。
    • 如果你已经设置了 GOPRIVATE,通常不需要额外设置 GONOPROXY
  2. 恢复默认值:
    如果你想恢复 GONOPROXY 的默认值,可以运行:

    go env -u GONOPROXY
    
  3. 代理配置:
    确保 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

然后基本上就可以拉取了

posted @   厚礼蝎  阅读(42)  评论(0编辑  收藏  举报
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示