Go导入私有仓库

使用go.mod依赖第三方库时,有以下要求:

  1. 代码仓库托管于VCS(版本控制系统);
  2. 代码仓库是公开的;
  3. 仓库地址使用域名访问;
  4. 仓库域名支持HTTPS访问。

对于自己或者公司内部搭建的私有git,这些条件是比较难同时满足的,本文我们就来看看这些条件不满足时,该怎么办?

这个问题其实分两种情况来看,如果你自己的仓库是一个"正规"的仓库,使用域名访问,不带端口,通过HTTPS访问,唯一的区别是你的仓库是私有的。这种情况下,只需要设置一下 GOPRIVATE 环境变量就可以了,值是你的仓库域名,可以带路径。托管于GitHub上的私有仓库也可以依此设置。比如你的仓库域名是 myrepo.com ,按如下设置环境变量即可:

GOPRIVATE=myrepo.com

如果你只有某个组下的仓库是私有的,可以通过路径指定,多个域名通过逗号分隔。

GOPRIVATE=myrepo.com/mygroup,myrepo.com/yourgroup

接下来就是比较复杂的情况,比如仓库是非标的,通过IP地址访问,或者需要带端口访问,还有只能通过HTTP访问等。这种情况下我们就需要对git下手了,因为 go get 最后还是会用到git来下载包。

第一步我们需要用一个标准仓库域名来充当门面,配置命令如下:

git config --global url."http://myrepo.com:8080/".insteadof "https://gitea.com/"

上面的命令会修改 C:\Users\kaka\.gitconfig 文件,给你加上下面的配置:

[url "http://myrepo.com:8080/"]
	insteadof = https://gitea.com/

当然,你也可以手动修改这个文件,加上上面的配置,再者可以在执行配置命令前后对比下这个文件的变化。这样,当我们访问gitea.com的时候,实际上会访问到myrepo.com:8080,而且从协议从HTTPS换到了HTTP。经过上面的偷梁换柱,我们已经做到了瞒天过海。

需要注意的是, insteadof 后面的域名要是一个"正规"的版本控制仓库。因为go在下载代码之前首先会通过 https://gitea.com/repo/test?go-get=1 获取信息,注意最后的 ?go-get=1 ,正常情况下它的响应如下:

html 复制代码
<!doctype html>
<html>

<head>
    <meta name="go-import" content="gitea.com/repo/test git https://gitea.com/repo/test.git">
    <meta name="go-source"
        content="gitea.com/repo/test _ https://gitea.com/repo/test/src/branch/main{/dir} https://gitea.com/repo/test/src/branch/main{/dir}/{file}#L{line}">
</head>

<body>
    go get gitea.com/repo/test
</body>

</html>

看到body中的内容了吗,这就是真正的代码获取地址。

如果仓库是私有的,那么我们还是需要配置 GOPRIVATE 环境变量。只不过这次我们要配置的域名是 insteadof 后面的域名,在我们的例子中应该配置 GOPRIVATE=gitea.com

第三步我们需要去修改 go.mod 文件,将包名中的域名换成 insteadof 后面的域名,此例中是 gitea.com

最后一步,在你的仓库中发布一个release,这样就可以在其他go项目中正常引入自己那非标仓库里的包了。

最后的最后,如果你使用的是GoLand或者IDEA,这类IDE好像有自己的环境变量机制,直接修改系统环境变量有时候不会生效,你需要在IDE里面设置或者在它的命令行通过 go env -w GOPRIVATE=gitea.com 这样的方式来设置。

相关推荐
小蜗牛慢慢爬行18 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
波音彬要多做29 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区38 分钟前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光41 分钟前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求1 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生1 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
wm10431 小时前
java web springboot
java·spring boot·后端
是娜个二叉树!1 小时前
图像处理基础 | 格式转换.rgb转.jpg 灰度图 python
开发语言·python
Schwertlilien1 小时前
图像处理-Ch5-图像复原与重建
c语言·开发语言·机器学习