终南捷径 發表於 2025-11-2 10:07:35

Go语言公司gitlab私有仓库依赖拉取配置的两种实现方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">为什么要考虑私有仓库</a></li><li><a href="#_label1">对于没有子目录的gitlab项目</a></li><li><a href="#_label2">对于子目录的gitlab项目</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>为什么要考虑私有仓库</h2>
<p>Go语言目前都已经采用了官方统一的 <code>go modules</code> 来管理依赖,后续也不太可能出现比较乱的生态, 因此了解下如何让这个依赖管理正常工作是非常必要的。</p>
<p>对于Github或者其他公有仓库,依赖管理是非常直接和方便的,设置好GOPROXY后,使用 <code>go get</code>去直接操作依赖,是不会报错的,很方便直接, 但是对于一些公司或者组织,一些代码不能公开的, 那就涉及到私有依赖管理了, 通常而言,直接使用<code>go get</code> 肯定会报错,去网上搜搜也不太全,设置完git url替换 之后,依然会报错。 本文主要是讲述,如何进行开发设置而不报错。</p>
<p class="maodian"><a name="_label1"></a></p><h2>对于没有子目录的gitlab项目</h2>
<p>如下面这种方式:</p>
<div class="jb51code"><pre class="brush:go;"># 仓库地址
https://gitlab.com/group/project

# gomodule 名称为
gitlab.com/group/project</pre></div>
<p>可以使用如下命令进行设置, 设置完成之后,则可以通过&nbsp;<code>go get</code>自动获取到依赖</p>
<div class="jb51code"><pre class="brush:go;"># 设置GOPRIVATE环境变量
go env -wGOPRIVATE=gitlab.com
go env -wGOPRIVATE=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
</pre></div>
<p>按照如上方法设置一下,你就能轻松通过&nbsp;<code>go get</code>来获取到私有的依赖,但这种方式有一个弊端,就是如果项目放在子目录下面,则依赖获取仍然会失败,下面就会讲一下两种在子目录存在的情况下,如何正常去获取私有依赖的方法。</p>
<p class="maodian"><a name="_label2"></a></p><h2>对于子目录的gitlab项目</h2>
<p>如下面这种方式</p>
<div class="jb51code"><pre class="brush:go;"># 项目地址
https://gitlab.com/group/subgroup/project

# go module 名称
gitlab.com/group/subgroup/project</pre></div>
<p>即使我们设置了正常的ssh key,和git的url替换,仍然会得到报错</p>
<div class="jb51code"><pre class="brush:plain;">The project you were looking for could not be found or you don't have permissions to view it. </pre></div>
<p>当我们用搜索引擎去搜去解决问题的时候,我们基本上搜到的结果都是让你去改 go module 的名称,如下</p>
<div class="jb51code"><pre class="brush:bash;">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</pre></div>
<p>它要求,必须要以 <code>.git</code>结尾,这样是一种比较简单的解决方案,但是正常的go module 命名一般是不带 <code>.git</code> 结尾的。 发生这种情况的原因是,它go get尝试发现给定路径上的模块以找到请求的 Go 模块存储库。只有找到存储库后,工具才会执行git clone或git checkout使用 SSH 密钥进行身份验证。问题归结为这样一个事实:如果没有 Gitlab 访问令牌,就无法列出/查看私有Gitlab 子组。 所以这个时候,我们就要用到下面这种方法。</p>
<ol><li>在gitlab中创建token <code>Gitlab-&gt;Preferences-&gt;Access Tokens</code></li><li>对于windows系统, 你可以先设置一个HOME的环境变量,指向你的用户目录,然后在用户目录下创建 <code>_netrc</code>文件; 对于Mac/Linux 则可以直接创建 <code>~/.netrc</code> 文件</li><li>按照如下方式编辑 <code>~/.netrc</code> 文件</li></ol>
<div class="jb51code"><pre class="brush:plain;">machine gitlab.com
    login my_gitlab_username
    password my_gitlab_token
</pre></div>
<ul><li>上述machine是指你的gitlab仓库的地址</li><li>login 则为你的gitlab的用户名</li><li>password就是第一步创建的gitlab访问token</li></ul>
<p>结合如上几种方式,你应该可以完整的解决掉你的go 获取私有依赖的问题。</p>
頁: [1]
查看完整版本: Go语言公司gitlab私有仓库依赖拉取配置的两种实现方式