配置GOPRIVATE引用私有仓库

现象

在使用gomod模式管理golang包的时候,下载开源的公共包还可以,但是一旦使用内部或者私有的包,就可能会出现如下所示的问题:

server response: not found: git.xxx.com/xxxxxx/xxx@v0.6.8: unrecognized import path "git.xxx.com/xxxxxx/xxx": https fetch: Get "https://git.xxx.com/xxxxxx/xxx?go-get=1": dial tcp xx.xx.xx.xx:443: connect: connection refused

原因

究其原因,一方面使用如下GOPROXY代理的方式,只能管理开源的golang包及依赖;另一方面,私有的仓库中的项目,需要配置相应的用户权限才能访问,并且通常需要配置跳过相关私有仓库。

GOPROXY="https://goproxy.cn,direct"

Windows系统使用以下命令设置GOPRIVATE为私有仓库地址:

set GOPRIVATE="git.xxx.com"
// 或者go env -w GOPRIVATE="git.xxx.com"
// 或者env:GOPRIVATE="git.xxx.com/"

PS:在命令行中,通过set GOPRIVATE的命令方式,只在当前命令行有效,换个编辑器,使用go env命令查看环境变量,发现还是没有设置,这时候就需要右键[我的电脑]设置该环境变量。
其中,git.xxx.com为私有仓库地址,在解析的时候使用使用前缀匹配的方式,所有的git.xxx.com地址中的所有项目都会被视为private-modules。配置该方式后,对于企业、私有Group等,只要代码仓库地址不变、属于项目组、并且有权限,配置一次就可以无限次拉取该私有仓库中的所有项目。

Linux设置方式,在terminal中输入以下命令:

export GOPRIVATE=git.xxx.com/

其中,git.xxx.com替换为具体的私有仓库域名。

解决方式

  1. 检查GO111MODULE是否打开

通过go env命令查看GO111MODULE配置是否打开,go 1.12及以下的版本需要配置如下环境变量打开GO111MODULE,go 1.13及以上的版本默认是打开的。

GO111MODULE=on 
  1. 设置代理环境变量
GOPROXY="https://goproxy.cn,directt"
// 或者也可以设置为 GOPROXY="https://goproxy.io,direct"
  1. 配置私有仓库域名
GOPRIVATE="git.xxx.com" (引号里替换公司私有库域名)
  1. 检查git config配置是否正确
git config -l 查看git的所有配置

如果git没有配置用户信息,可以通过如下命令设置。

git config --global user.name="xxx" 

注意:也可以使用git config --global user.name “xxx” 命令设置用户名,一般是git账户的邮箱前缀,使用global user.email命令设置邮箱,一般只需设置一个用户名即可。

  1. 将下载代码方式由http改为ssh

执行如下命令将获取仓库项目的方式由http或https改为ssh。

git config --global url."ssh://git@git.xxx.com:port/".insteadOf "https://git.xxx.com/"

由于go install、go mod tidy 命令下载依赖的时候是通过git命令去下载的,而且默认使用http或https协议,上面使用命令修改为ssh协议去获取。

  1. 查看包之间的依赖关系与权限

在拉取私有包,可以使用-x参数获取详细信息,例如go get -x git.xxx.com/xxx,查看是否存在包与包之间的依赖关系。

go get -x git.xxx.com/xxx

PS:有些私有包可能没有权限,也会导致获取依赖包失败。

  1. 使用go mod tidy管理go mod依赖
go mod tidy

设置完上面的配置后,如果通过go mod tidy或者go get -x 所需要下载的私有包 命令后,出现下面的信息:

go: git.xxx.com/go-xxx/xxxxx@v0.xxx.0: unknown revision v0.xxx.0

或者

go get: module git.xxx.com/xxx/xxxxxx: git ls-remote -q origin in D:\Go1.16\gopath\pkg\mod\cache\vcs\xxxexxxxxx666xxxx8888xxx: exit status 128:
        Host key verification failed.
        fatal: Could not read from remote repository.

        Please make sure you have the correct access rights
        and the repository exists.

可能是因为在配置GOPRIVATE和SSH方式下载私有包之前已经通过git clone http或https的方式下载过,导致包冲突,把原来下载的包删除,再重新执行git clone ssh://git@git.xxx.com:port/xxxxxx/xxxxx.git的ssh方式下载私有包,然后通过go get -x git.xxxxxx.com/xxxxx或者go mod tidy命令重新下载依赖。

参考

Go填坑之将Private仓库用作module依赖
go mod依赖离线安装_go mod 安装依赖 unkown revision问题解决
使用git config --global设置用户名和邮件

### 如何在 Golang配置和使用多个私有 Git 仓库 #### 配置 Go 获取依赖项的方式 Go 使用模块化管理系统来处理外部包的依赖关系。对于私有 Git 仓库,可以通过设置 `GOPRIVATE` 环境变量指定哪些路径下的模块应被视作私有的,从而跳过代理并直接通过版本控制系统获取源码。 ```bash export GOPRIVATE="gitlab.example.com,bitbucket.org/some-team" ``` 这使得 go mod 能够识别特定域名下的所有库为私有资源[^2]。 #### 设置 SSH 访问权限 为了使 Go 工具链能够访问私有存储库中的代码,需确保本地机器已正确设置了 SSH 密钥对,并将其公钥添加到了目标 Git 托管服务上(如 GitHub/GitLab)。此外,还需验证 `.ssh/config` 文件中是否有针对不同主机名的身份认证条目: ```plaintext Host gitlab.example.com HostName gitlab.example.com User git IdentityFile ~/.ssh/id_rsa_example ``` 此操作允许无密码克隆来自该服务器上的任何私有仓库[^1]。 #### 替换 URL 方便内部网络访问 如果公司内网中有镜像站点,则可以利用 Git 的替代机制重写远程地址。例如,在全局范围内应用如下命令可实现当遇到某些前缀时自动转换成另一套协议或域名称: ```bash git config --global url."https://mirror.gitlab.local/".insteadOf "https://gitlab.example.com/" ``` 这样做的好处是可以加速下载速度以及绕开可能存在的防火墙限制。 #### 修改项目内的依赖声明 最后一步是在项目的 `go.mod` 文件里指明所需的第三方软件包及其版本号。假设有一个位于企业自建 Git 实例里的 HTTP 客户端库,那么可以在导入语句处按常规方式书写其完整的 import path: ```go import ( "gitlab.example.com/internal/httpclient" ) ``` 只要之前已经完成了必要的环境准备,构建过程就会顺利找到对应的源文件并完成编译链接工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

love666666shen

谢谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值