Go语言中,公司gitlab私有仓库依赖拉取配置

为什么要考虑私有仓库

Go语言目前都已经采用了官方统一的 go modules 来管理依赖,后续也不太可能出现比较乱的生态, 因此了解下如何让这个依赖管理正常工作是非常必要的。

对于Github或者其他公有仓库,依赖管理是非常直接和方便的,设置好GOPROXY后,使用 go get去直接操作依赖,是不会报错的,很方便直接, 但是对于一些公司或者组织,一些代码不能公开的, 那就涉及到私有依赖管理了, 通常而言,直接使用go get 肯定会报错,去网上搜搜也不太全,设置完git url替换 之后,依然会报错。 本文主要是讲述,如何进行开发设置而不报错。

对于没有子目录的gitlab项目

如下面这种方式:

bash 复制代码
# 仓库地址
https://gitlab.com/group/project

# gomodule 名称为
gitlab.com/group/project

可以使用如下命令进行设置, 设置完成之后,则可以通过 go get自动获取到依赖

bash 复制代码
# 设置GOPRIVATE环境变量
go env -w  GOPRIVATE=gitlab.com
go env -w  GOPRIVATE=gitlab.bitmartpro.com

# 设置URL替换,把https转为ssh获取依赖
git config --global url."git@gitlab.com".insteadOf "https://gitlab.com"
git config --global url."git@gitlab.bitmartpro.com:".insteadOf "https://gitlab.bitmartpro.com/"

# 如果遇到https报错,可以设置如下,如果本身就是正常的https就不用去管了
git config --global http.sslVerify false

按照如上方法设置一下,你就能轻松通过 go get来获取到私有的依赖,但这种方式有一个弊端,就是如果项目放在子目录下面,则依赖获取仍然会失败,下面就会讲一下两种在子目录存在的情况下,如何正常去获取私有依赖的方法。

对于子目录的gitlab项目

如下面这种方式

bash 复制代码
# 项目地址
https://gitlab.com/group/subgroup/project

# go module 名称
gitlab.com/group/subgroup/project

即使我们设置了正常的ssh key,和git的url替换,仍然会得到报错

复制代码
The project you were looking for could not be found or you don't have permissions to view it.

当我们用搜索引擎去搜去解决问题的时候,我们基本上搜到的结果都是让你去改 go module 的名称,如下

复制代码
rm go.mod go.sum
go mod init gitlab.com/myuser/foogroup/barlib.git
go mod tidy

cd /go/src/another_project
go get gitlab.com/myuser/foogroup/barlib.git

它要求,必须要以 .git结尾,这样是一种比较简单的解决方案,但是正常的go module 命名一般是不带 .git 结尾的。 发生这种情况的原因是,它go get尝试发现给定路径上的模块以找到请求的 Go 模块存储库。只有找到存储库后,工具才会执行git clone或git checkout使用 SSH 密钥进行身份验证。问题归结为这样一个事实:如果没有 Gitlab 访问令牌,就无法列出/查看私有Gitlab 子组。 所以这个时候,我们就要用到下面这种方法。

  1. 在gitlab中创建token Gitlab->Preferences->Access Tokens
  2. 对于windows系统, 你可以先设置一个HOME的环境变量,指向你的用户目录,然后在用户目录下创建 _netrc文件; 对于Mac/Linux 则可以直接创建 ~/.netrc 文件
  3. 按照如下方式编辑 ~/.netrc 文件
bash 复制代码
machine gitlab.com
    login my_gitlab_username
    password my_gitlab_token
  • 上述machine是指你的gitlab仓库的地址
  • login 则为你的gitlab的用户名
  • password就是第一步创建的gitlab访问token

结合如上几种方式,你应该可以完整的解决掉你的go 获取私有依赖的问题。

相关推荐
chuan.bai19 分钟前
Java RAG 实战(第 11 篇):RAG 知识工作台网页
java·开发语言·人工智能
离陌在学C#3 小时前
C# 事件(Event)详解:从概念到实战
开发语言·c#
Terra.K3 小时前
Java异常学习[特殊字符]
java·开发语言·学习
葡萄城技术团队5 小时前
InfluxDB 2\.x 深度解析:核心架构、Flux 函数与制造业落地指南(三)
java·开发语言·架构
counting money5 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
wuyk5555 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无5 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
波特率1152005 小时前
C++新特性---属性说明符与标准属性
开发语言·c++
程序员小八7775 小时前
上海百度B端java后端日常实习一面
java·开发语言
wp123_16 小时前
IPX8 防水 Type‑C连接器:安费诺 124018792112A 与 TONEVEE TY48087‑24A 技术梳理
c语言·开发语言