惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
S
Security Affairs
H
Hacker News: Front Page
TaoSecurity Blog
TaoSecurity Blog
W
WeLiveSecurity
G
GRAHAM CLULEY
T
Tenable Blog
Schneier on Security
Schneier on Security
S
Securelist
Cyberwarzone
Cyberwarzone
P
Privacy International News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
C
Cisco Blogs
T
Threat Research - Cisco Blogs
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
D
DataBreaches.Net
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
J
Java Code Geeks
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

Tony Bai

不用 Python,也能训练大模型:两年之后再看 Go 语言机器学习框架 GoMLX 百万行代码,两周搞定!Anthropic揭秘AI代码迁移六步法:秘诀不是改代码,是改流程 重磅!Tokio官方发布全栈框架Topcoat:不用WASM,AI时代Rust也能“糊”网页了 软件工厂的明与暗:当代码可以自动生产,人类为何必须留下一盏灯? Twitter之父再出手:Block开源Buzz,要让人类和AI Agent「同工同权」 Go 密码学维护者放大招:把 Passkey 存成一行字符串,还顺手为 Go 1.28 写好了 API Loop Engineering才火两个月,硅谷已经卷出“Graph Engineering”了 我开源了 cc-session-migrate :让 Claude Code 会话在多台机器之间自由迁移 从掌上设备的失败到AI时代的基石:Java官方纪录片,揭开一门语言30年的生死赌局 “皇帝的新衣”一年后:对话Thorsten Ball谈Agentic编程 告别标签页焦虑:我让 AI 帮我做了个浏览器插件 TabQueue Bun刚把Zig重写成Rust,这个团队却用487天反向重写 为了一个函数名,Go官方吵了两个月:maps.Same提案近日正式通过 Go 1.28 路线图首度曝光:Cgo 告别C工具链?泛型容器将入标准库? 掌控外环:为什么“循环工程”的边界必须由人类死守? 171个“已批准”却迟迟未实现的提案:Go语言的十年“欠账清单” 别再往 Go 里塞 Java 了:拆解 spf13 的 Idiomatic Go 信仰 AI 不在乎代码烂不烂,但你的Token账单在乎:一项660次实验揭示的编程新常识 10倍速 TypeScript 7.0 正式发布,前Go产品经理:Go才是AI智能体时代的“天选语言” Bun 重写为 Rust 后,Zig 之父罕见开炮:“我们早就等着看你重写” 全新 AI 技术栈:模型、Harness、Loop 与自我进化的智能体 AI 重写 Bun 为Rust全过程揭秘:101万行代码、11天、64个Claude并行开工 MCP Server 架构模式全解析:5 种模式、4 个反模式,与那条不能越过的“工具数量红线” 从手动 govanityurls + Nginx 迁移到 gvu:一次真实迁移记录 Go 私有模块拉取全解:凭据配置 + Vanity URL,个人与组织全覆盖 从“切歌小工具”到“零人工代码”:Claude Code 的诞生史,比科幻还科幻 如何使用 Claude Code 构建 AI 循环系统(Loops) 5 分钟上手 gvu:把 vanity import path 这件事,从“半天运维”变成一条命令 Go 对语言演化的保守态度,在未来 5 年是否仍然正确呢? 别把“容易”当“简单”:Gin 框架作者撰文揭秘 88k Star 背后的架构哲学 每个 AI 工程师都应该知道的 20 个循环设计模式 cc-switch-cli:专为终端控与远程开发打造的 Claude Code 多模型切换工具! Andrej Karpathy 解析 Loop Engineering:构建“数日级”长程 Agent 的 9 条黄金法则 HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? HashiCorp 创始人:AI 时代,我们为什么越来越需要有“品味”的程序员? 一个 Rust 项目吃掉 75GB 硬盘?聊聊 Go 与 Rust 的“缓存焦虑”与拯救指南 折腾过各种语言后,我为什么总是回到 Go 语言? YC 揭秘 AI 原生组织:打造一家在睡梦中自我进化的公司 从 WordPress 到 Hugo:一个 20 年技术博客的迁移实录 偿还十年技术债:深度拆解 Go 1.27 的 GODEBUG 强力清理计划 浏览器里的“安全阴谋”:为什么 Go 1.27 的 UUIDv7 会离奇丧失随机性? Go 1.27新特性前瞻:泛型方法落地,标准库内建 UUID - Tony Bai AI 正在撕裂研发团队:狂欢的“托管派”与心碎的“守夜人” - Tony Bai 屠榜 CNCF!为什么在云原生时代,Go 语言能把 Java、C++ 和 Rust 堵在门外? 上千程序员自爆 AI 的“卧槽时刻”:是推开神界大门,还是跌入黑盒地狱? - Tony Bai 大模型正在见顶!传奇架构师:欢迎来到“平坦曲线时代” - Tony Bai Anthropic 40万大样本揭秘:AI 时代为什么“专家”身价暴涨? - Tony Bai 在 AI 编码时代,为什么我们依然选择 Go 而不是 Rust? DeepMind 亮出王炸:别再手写 Agent Harness 了,AI 已经学会自己写了! 为什么说“编译通过,就能运行”?Google 专家 Alice 揭秘 Rust 的工程美学与底层逻辑 谷歌 SRE 重磅白皮书:当 AI 自动写出 10 倍代码,谁来阻止系统崩溃? 别再省 Token 了!硅谷新共识:浪费算力才是唯一捷径 - Tony Bai Linux 内核顶级维护者:写了 35 年 C,是 Rust 让我重新找回了编程的乐趣 拒领上亿、封杀 AI:Zig 之父为什么 10 年不发 1.0? 写地道的 Go 语言,是否能让你成为了一个更好的开发者? - Tony Bai RSA 将死?Let’s Encrypt 押注 MTCs 迎战后量子时代 C++ 的权力游戏:一部关于妥协、背叛与重生的“史诗神剧” - Tony Bai 终结十年纠结:Go 新提案允许 Example 支持任意函数签名 - Tony Bai 2026年,大厂重构核心系统为何集体投向 Go? - Tony Bai “辛辛苦苦考上985,却发现AI能替代我90%的工作”:今天的高考,我们还在为什么而战? - Tony Bai 传奇黑客 Geohot 炮轰 AI Agent:这是软件工程史上代价最昂贵的灾难! 别把 Go 写成 Java:毁掉项目从过度架构开始 - Tony Bai 开源维护者的困境 - Tony Bai AI 时代如何真正掌握一门新技术?这份非主流学习指南建议永久收藏 - Tony Bai Go 生态17年大浪淘沙:2026年最值得引入的10个“神仙级”QoL工具包 - Tony Bai 再见样板代码!Go 官方新提案:函数一键转接口 - Tony Bai 写代码快 10 倍,不等于研发快 10 倍!Google 揭秘 AI 系统级瓶颈 Google I/O 2026:Jeff Dean 携 DeepMind 众神宣告,AI Agent 正在终结“标准化软件”时代 AI 优化 1.5ms,手写 0.02ms!Ghostty 作者痛批 AI 编程“平庸陷阱” Redis 之父吐槽现代前端的复杂性:我们到底是在解决问题,还是在制造问题? - Tony Bai 无痛消灭技术债:Google I/O 2026 开启 Go 自动重构时代 省下 10% CPU!Uber 揭秘 Go 栈扩容的隐秘代价 从 Go 迁移到 Rust - Tony Bai 悄悄用 Go 重写 AI 基础设施:NVIDIA 的 GPU 云平台为何选择 Go? Shopify 23,000 名工程师背后的 Claude Code 配置方案(你可以直接复刻的完整配置) Google 开源 AX 与 Agent Substrate:构建以 Agent 为核心的云原生计算底座 十年难题终获突破:揭秘 Go 1.27 接口逃逸分析优化 - Tony Bai
五年,三篇文章,一个我一直没真正解决的问题
Tony Bai · 2026-07-05 · via Tony Bai

题图

本文永久链接https://tonybai.com/2026/07/05/go-private-modules-lessons-learned

大家好,我是Tony Bai。

五年前,我写过两篇文章,讲的是怎么在公司内部搭一套私有 Go module 拉取方案。三年前,我又补了第三篇,说这套东西“跑了两年,基本没什么大问题”。

三篇文章,五年时间,我一直以为这件事已经被我解决了。

直到上个月,我们把一个 Go 私有库以白盒方式交付给一家客户。第二天一早,对方工程师就甩来一段报错:

$ go mod tidy
go: finding module for package mycompany.com/go/common
go: mycompany.com/go/common: unrecognized import path "mycompany.com/go/common":
    https fetch: Get "https://mycompany.com/go/common?go-get=1":
    dial tcp: lookup mycompany.com: no such host

我盯着这段报错愣了几秒,随即哑然失笑——这不就是五年前我们内部第一次遇到的那个问题吗?只不过这一次,“内部”变成了别人的“内部”。

五年里,我一直在同一个边界内部不断打磨这套方案,却从没想过,如果有一天代码要跨出这个边界呢?

客户的开发机、CI 机器,统统访问不到我们组织内部的私有 GOPROXY 服务器,也访问不到我们内部的 VCS。代码本身没有任何问题,问题出在一个我们几乎从未认真思考过的地方:这个 Go module 的 import path 本身,是一个只在我们自己的网络边界里才成立的“承诺”。

五年前,这个问题第一次找上我

这不是我第一次跟这类问题交手。

2021 年,我写过一篇《小厂内部私有Go module拉取方案》。当时的背景很简单:随着公司里 Go 项目变多,“代码重复"问题冒了出来,我们把公共代码抽成了内部私有仓库,于是就有了"如何让 go get 拉到私有Go代码库"这个需求。

大厂的答案很简单——因为大厂内部的 VCS 天然就挂在一个内部域名下(比如 git.company.com),import path 直接指向真实仓库地址即可,go get 该怎么工作就怎么工作。

但小厂或个人开发者通常没有这个条件:我们希望私有 module 的 import path 是干净的、带有自己域名语义的(比如 mycompany.com/go/common),但这个域名背后并没有真的托管代码,代码实际存放在内部的 Git 服务器上。这中间,需要一层"翻译”。

我们当时选择的方案是 govanityurls + Nginx + 内部 GOPROXY 的组合:govanityurls 负责把 mycompany.com/go/common 这样的 vanity import path 翻译成真实的仓库地址,内部 GOPROXY 负责统一代理公共 module 和私有 module 的拉取。开发者只需要把 GOPROXY 指向内部代理,剩下的事情对他们透明。

这套方案上线之后,确实解决了当时的问题。

方案在演进,但边界的假设没有变

2022 年,业务线决定把代码托管从 Gerrit 迁移到 GitLab,我又写了篇《小厂内部私有Go module拉取方案(续)》,记录了适配过程中踩的坑——SSH 密钥交换算法不匹配、vanity.yaml 里仓库地址的调整,等等。本质上,这次只是把"翻译层"背后指向的仓库换了个地方,原理没有变。

2023 年,我又写了第三篇《小厂内部私有Go module拉取方案3》。那时候这套基础设施已经稳定运行了两年,“总体感觉不错,没什么大问题”。文章里我提到了一个一直没有优雅解决的小麻烦:每次新增一个用作私有依赖的仓库,vanity.yml 都得手动改一次,开发者对这种运维琐事天然是抗拒的。同一篇文章里,我还顺手研究了一下 go mod replace 能不能绕开 vanity 层直接指向内部仓库——最后发现 Go 官方早就支持了这种用法,只是没多少人知道。

回头看这三篇文章,我当时关注的都是"怎么让方案更稳、更省心",但有一个前提我从来没有认真质疑过:

所有这些方案,都默认"拉代码的人"和"存代码的服务器"处在同一个网络边界、同一个信任边界里。

五年里,我们不断优化这个边界内部的体验,却从来没想过,如果有一天代码需要跨出这个边界呢?

今年,边界本身松动了

今年我们开始以白盒方式向客户交付 Go 私有库的源码。这是一种新的交付模式:不再是"我们运营一个服务,客户调用接口",而是代码本身要跑到客户自己组织的机房里,由客户自己的工程师编译、构建和维护。

这一下子把五年来被小心维护的假设全部打破了:

  • 网络边界变了:客户访问不到我们内部的私有 GOPROXY,也访问不到我们内部的 Git 服务器。
  • 信任边界变了:我们不可能把内部 VCS 的访问凭证交给客户,那意味着客户能拿到我们所有其他私有代码。
  • 组织边界变了:mycompany.com/go/common 这样的 import path,在客户的网络里就是个死链接,govanityurls 部署在我们这边,客户那边根本连不到。

于是我们不得不在客户组织内部,重新搭建一套简化版的私有 module 拉取方案——申请域名或者用内网 DNS 顶一下、配一遍 vanity 映射、协调 GOPROXY 或 GOPRIVATE、把仓库权限单独开一份给客户。整个过程和五年前第一次搭建时几乎一样繁琐,唯一的区别是,这次要在一个我们不熟悉、不受控的环境里,重新做一遍。

那一刻我意识到,这从来都不是一个"公司内部基础设施"问题,而是一个更普遍的问题:

只要代码需要跨越一个信任边界——从团队到团队,从公司到客户,从内网到公网——import path 和它背后真实仓库地址之间的这层"翻译",就会重新变成一个需要人工搭建的脆弱环节。

这个问题不是 Go 独有的,几乎任何一种需要"私有代码分发"的语言生态都会遇到类似的处境。只是 Go 因为 go get 直接依赖 import path 做域名解析这个设计,把这个问题暴露得格外明显。

命令行,正在重新变成“控制面”

过去这类"边界重新搭建"的问题,标准答案往往是造一个管理后台:一个 Web UI,让你去配置域名映射、TLS 证书、路由规则——本质上是把运维动作图形化。

但对开发者来说,这从来都不是最自然的心智模型。真正高频的运维动作,最后总会被收敛成一行命令:gh repo createwrangler deploysupabase db push——这几年你会发现,越来越多原本需要打开一个 Web 控制台才能完成的事情,正在被重新压缩进终端里的一行命令。命令行不再只是"极客的偏好",它正在重新成为很多产品事实上的控制面,AI 时代尤甚。

这和我这五年反复折腾的事情,其实是同一个道理:vanity.yml 手动改一次、Nginx 配一次、GOPROXY 调一次——这些散落在不同工具、不同配置文件里的动作,本质上都应该是一个命令的事。不管这个"边界"是公司内部,还是客户组织内部。

顺手把这五年的认知封装了一下

所以这次白盒交付踩完坑之后,我索性把这五年反复重复的这套操作——vanity import path 的映射、私有 module 的拉取配置——抽象成了一个通用的命令行工具,取名 gvu(gomodvanityurls 的缩写)。它现在正在做公测,官网在 gomodvanityurls.com

它解决的问题很朴素:不管你是要在公司内部搭一套私有 module 拉取方案,还是像我们这次一样要在客户组织内部临时重建一套,都不用再手写 vanity.yml、配 Nginx、协调 GOPROXY 这些琐事了,一行命令搞定映射和分发。

这篇不是产品说明书,就不展开细节了,后面我会单独写几篇上手向的文章。感兴趣的话可以先去gvu官网看看,花五分钟体验一下。

这次,go build 一次成功

方案在客户组织内部重新搭好之后,我又收到了那位工程师的消息,这次贴的是:

$ go mod tidy
go: downloading mycompany.com/go/common v1.2.3
$ go build ./...

没有报错,干干净净地结束。

五年前那篇文章的开头,我写过"Go module 拉取公共依赖不再是痛点"。五年后我想补一句:私有依赖的拉取,只要代码不跨越边界,也早就不是痛点了。真正的痛点,永远出现在边界被打破的那一刻。

小结

这五年,我们的方案从“能用”到“稳定”,看起来是在不断进步,但本质上一直是在同一个边界内部打磨细节。

今年白盒交付撞到的这堵墙,才让我第一次看清问题的全貌:Go 私有 module 的拉取困境,本质上是一个"代码如何优雅地跨越信任边界"的问题,而不是一个"公司内部该怎么配置 GOPROXY"的问题。

五年三篇文章,记录的都是同一个问题在不同场景下的重复出现。这一次,我把重复出现的部分做成了一个工具。

接下来,我会写几篇 gvu 的上手教程和一些进阶用法,感兴趣的朋友可以留意后续文章。

如果你也被"私有 Go module 怎么优雅分发和拉去"这个问题困扰过,欢迎在评论区聊聊你的方案,说不定又是一次有意思的讨论。


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 从0 开始构建 Agent Harness 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。