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 这样的方式来设置。

相关推荐
Passion不晚5 分钟前
Spring Boot 入门:解锁 Spring 全家桶
spring boot·后端·spring
NuyoahC25 分钟前
Python语法(二)——函数
开发语言·笔记·python
灵嗅26 分钟前
python qt5 常用
开发语言·qt
蜡笔小流41 分钟前
Flask 第六课 -- 路由
后端·python·flask
江凡心41 分钟前
Qt 每日面试题 -2
开发语言·数据库·qt·面试
怪人细胞1 小时前
【远程调用PythonAPI-flask】
后端·python·flask
为啥不吃肉捏1 小时前
C++/Qt 集成 AutoHotkey
开发语言·c++·qt
代码吐槽菌1 小时前
基于SpringBoot的在线点餐系统【附源码】
java·开发语言·spring boot·后端·mysql·计算机专业
努力学习的小廉1 小时前
【C++】—— string模拟实现
开发语言·c++
凌晨五点的星1 小时前
网络安全-webshell绕过,hash碰撞,webshell绕过原理
开发语言·前端·javascript