Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|如何拉取私有的Go Module?

统一GOPROXY服务处理外部和私有Go Module
直连组织公司内部的私有Go Module服务器
配置GOPROXY和GOPRIVATE环境变量
配置GONOSUMDB环境变量避免sum校验
配置GOPROXY环境变量
配置govanityurls映射私有module到vcs仓库地址
配置nginx转发请求到govanityurls
配置goproxy启动参数排除私有module
使用govanityurls和nginx
启动goproxy
安装goproxy
内部vcs服务器
公共vcs服务的private repository
私有Go Module拉取成为需求
公共Go Module拉取不再是问题
优先使用workspace下的module源码
Go工作区(Go workspace)
替换为本地路径
伪造版本号满足语法要求
使用go.modreplace指示符
分享和讨论
是否有不同的解决方案?
降低开发人员心智负担
推荐使用统一GOPROXY代理方案
Go 1.18版本的期待
无法划分权限
新增私有Go Module需要手工更新vanity.yaml
需要额外配置GONOSUMDB变量
开发机(客户端)的设置
自定义包导入路径映射到内部vcs仓库
选择GOPROXY实现
示例环境准备
参考方案
需求背景
Go 1.18版本预期解决方案
解决方案
问题:如何导入尚未发布到公共站点的本地module
Go 1.11版本引入
Go Module构建模式
思考题
小结
方案的不足
统一GOPROXY方案的实现思路与步骤
拉取私有Go Module
导入本地Go Module
Go Module问题解决方案

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
我们这门课程上线以来收到了同学们的众多留言与热烈反馈,在这些留言和反馈中,有关 Go Module 的问题占比比较大,其中又以下面这两个问题比较突出:
在某 module 尚未发布到类似 GitHub 这样的网站前,如何 import 这个本地的 module?
如何拉取私有 module?
借这次加餐机会,今天我就针对这两个问题和你聊聊我知道的一些解决方案。
首先我们先来看第一个问题:如何导入本地的 module。

导入本地 module

在前面的 06 和 07 讲,我们已经系统讲解了 Go Module 构建模式。Go Module 从 Go 1.11 版本开始引入到 Go 中,现在它已经成为了 Go 语言的依赖管理与构建的标准,因此,我也一直建议你彻底抛弃 Gopath 构建模式,全面拥抱 Go Module 构建模式。并且,这门课中的所有例子和实战小项目,我使用的都是 Go Module 构建模式。
当我们的项目依赖已发布在 GitHub 等代码托管站点的公共 Go Module 时,Go 命令工具可以很好地完成依赖版本选择以及 Go Module 拉取的工作。
不过,如果我们的项目依赖的是本地正在开发、尚未发布到公共站点上的 Go Module,那么我们应该如何做呢?我们来看一个例子。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Go Module在处理本地未发布的module以及拉取私有module时可能遇到的问题,并提出了解决方案。其中包括手动添加require指示符和使用replace解决本地未发布module的依赖问题,以及通过搭建goproxy服务或统一的GOPROXY服务来拉取私有module。文章还介绍了统一Goproxy方案的实现思路与步骤。通过解决本地未发布module和拉取私有module的需求,展示了Go Module在实际应用中的解决方案,为读者提供了有益的技术参考。文章内容涵盖了搭建goproxy服务、自定义包导入路径、开发机客户端设置等方面,为读者提供了详实的操作指导和技术支持。文章还提到了Go 1.18版本的工作区机制,以及针对导入本地Go Module和拉取私有Go Module的不同解决方案。文章内容丰富,对于使用Go语言的开发人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 罗杰
    一直使用的都是 replace,还好我们的代码不是太多,人员也少,还没有自己造出比较好用的轮子,所以 replace 的都是本仓库内的代码,仓库内包含公共库和服务。期待 1.18 能尽可能降低开发者的心智负担,replace 我刚开始用的时候,理解起来还是非常费劲的。虽然比 gopath 好了不少,但是 go 在引包的这一块相比简单哲学还是不够友好。

    作者回复: 这块的确给gopher们带来不少“困扰”。

    2022-01-21
    4
  • lesserror
    大白老师的每篇文章,我都会认真研读几遍。这个专栏下来,自己认为对Go有了全面的认识。有几个小问题,还请解答。 1. 文中:export GOPRIVATE = {private module list},“private module list” 这里的配置大概是什么样子的呢? 2. 老师,安装goproxy这里,这个地址:http://10.10.20.20:8081 是不是相当于自己搭建的内网 服务器地址,每个人的都可能不同? 我用本地 127.0.0.1地址来安装测试,出现了这个错误:goproxy.io: http: proxy error: dial tcp: lookup goproxy.iogoproxy.io: no such host / goproxy.io: 0.460s 502 /github.com/pkg/errors/@v/list 3. 统一 Goproxy 方案的实现拓扑图中的 gerrit git 服务器(10.10.30.30)这里的 “gerrit” 代表什么意思呢?

    作者回复: 感谢长期以来的支持。从专栏的留言情况来看,你也是整个专栏学习最认真的童鞋了,好像也没有之一:)。 1. GOPRIVATE=corporate1.com/repo1/module1, corporate2.com/repo2/module2,一个逗号分隔的module前缀列表,具体可以看一下 https://go.dev/ref/mod 2. 10.10.20.20是举例中的内网 服务器地址,根据环境自行设定。至于你遇到的错误,你看看设置的GOPROXXY环境变量是否ok?是否设置到你本地goproxy服务所监听的端口了?另外你的机器访问goproxy.io是否是ok的? 3. gerrit是google开源的代码review工具,可与git server集成,这里你就把它当做一个普通的git server就行了。

    2022-01-31
    1
  • 哈哈哈哈哈
    好耶%*%

    作者回复: 👍

    2022-01-21
    1
  • 天天向上
    内部采用了方案二,Gitlab托管的公共库

    作者回复: 👍

    2022-08-22归属地:北京
  • 锋子
    好像懂了,又好像没懂。 对于go.mod的module名字有啥意义不? 是否可以随便取,还是会影响什么? 比如我要引用的moduleB,那这个moduleB是在哪里定义的? 是moduleB的go.mod里配的名字还是路径名字?

    作者回复: 如你提到的,如果要引用moduleB,那么就应该使用moduleB的go.mod中的module path。

    2022-06-17
  • 瓜牛
    想问一下那种非github的仓库,比如Russ Cox的个人域名(好像是rsc.io?)作为前缀的module是如何实现的,go get的搜索路径是怎样的?

    作者回复: 在不考虑goproxy的情况下,go get会直接去访问rsc.io/xxx啊。但是显然rsc.io/xxx上的服务会将该go module的真实地址github.com/rsc/xxx返回给go get,go get拿到真实地址后,会继续到真实地址上去获取go module。 本篇加餐中的“自定义包导入路径并将其映射到内部的 vcs 仓库”一节说的就是这个事情。

    2022-05-31
    2
  • 张申傲
    公司里正好用到了私有仓库的搭建,二刷一下,老师的每篇文章都是精品。

    作者回复: 👍

    2022-04-07
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部