当前位置: 首页 > news >正文

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 ,正常情况下它的响应如下:

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

http://www.lryc.cn/news/339358.html

相关文章:

  • GIS GeoJSON数据获取
  • 书生·浦语大模型实战营 | 第3次学习笔记
  • easyExcel - 按模板导出
  • 使用 Tranformer 进行概率时间序列预测实战
  • LLM大语言模型助力DataEase小助手,新增气泡地图,DataEase开源数据可视化分析平台v2.5.0发布
  • 维修伊顿触摸屏不显示工业电脑人机界面EATON XVS-430-10MPI-1-10 深圳捷达工控维修
  • 趣话最大割问题:花果山之群猴博弈
  • 上周面试了一个大模型算法岗的女生,有点崩溃。。。
  • AI系列:大语言模型的function calling
  • conda 创建、激活、退出、删除虚拟环境
  • 【Entity Framework】聊一聊EF中继承关系
  • curaengine编译源码之libarcus编译记录
  • 运用OSI模型提升排错能力
  • 【Node.js】Express学习笔记(黑马)
  • Linux系统部署Tale个人博客并发布到公网访问
  • CentOS7里ifcfg-eth0文件不存在解决方案/Centos7修改网络IP解决方案
  • go第三方库go.uber.org介绍
  • Oracle 正则表达式
  • MongoDB聚合运算符:$rand
  • 如何在Linux通过docker搭建Plik文件系统并实现无公网IP管理内网文件
  • k8s部署efk
  • AI模型大PK
  • Matlab|基于广义Benders分解法的综合能源系统优化规划
  • vscode 打代码光标特效
  • 【代码随想录算法训练营第四十八天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III】
  • 蓝桥杯 — —灵能传输
  • 智慧安防系统EasyCVR视频汇聚平台接入大华设备无法语音对讲的原因排查与解决
  • 基于Pytorch框架的CNN-LSTM模型在CWRU轴承故障诊断的应用
  • QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid
  • mysql中的视图