开发时经常要在本地、测试、预发几套 hosts 之间来回切换。我一直不太放心让多个工具同时修改 /etc/hosts:Docker Desktop 、VPN 客户端刚写进去的内容,或者自己手动添加的行,下一次切换时都可能被覆盖,而且事前没有任何提醒。
所以我用 Swift 写了一个 macOS 原生工具:hostflip。MIT 开源,免费使用。
https://github.com/heronapp/hostflip
它的核心思路只有一条:hosts 文件是你的,不是工具的。
主要能力
- 外部改动先审后写。其他工具或你手动修改 hosts 后,hostflip 会检测差异并停止写入,在应用内显示 diff ;只有明确处理完差异后才会继续,不会默默覆盖。
- 基线保留,方案集中管理。首次启动时将
/etc/hosts导入为只读的 Base Hosts ,合并时始终放在最前;激活方案集中放在文件末尾,并用hostflip:begin/hostflip:end标出起止位置,卸载后也容易识别和手工删除。 - 保留原始备份。首次启动时读取的原文件还会另存为
hosts.orig,hostflip 不会重写这份备份。 - 组内互斥,跨组叠加。方案可以分组,每组最多激活一个(例如 staging / production 二选一);不同组的激活方案和独立方案可以同时生效,最终合并为一份 hosts 。
- 菜单栏一键切换,不弹密码。首次切换时按系统提示批准 helper ,之后切换无需再输入密码。
- 总开关。一键暂停后,hosts 恢复为基线内容;各方案的激活状态仍会保留,重新开启后恢复原来的组合。
- 命令行 + JSON 输出。
hostflip activate staging/api用于切换方案;hostflip doctor dev.example.com会一次检查从方案、合并结果、系统文件到解析器的整条链路,排查“为什么切了还是老地址”很省事;--json便于接入脚本和 CI 。 - 远程方案。从 HTTPS 地址获取内容并按计划自动刷新。
- 顺手的编辑器。⌘⇧F 可跨所有方案搜索 hostname / IP 并跳到对应行,⌘/ 可一键注释或取消注释;只写了 IP 、缺少 hostname 的不完整行会在行号栏标出。即使远程方案有几万行,打开和滚动也不卡。
- 原生实现。使用 Swift + SwiftUI ,常驻菜单栏,不依赖 web 运行时。
如果你正在用 SwitchHosts:可以一键导入现有配置(不导入开关状态),详细说明见 迁移指南。
限制:目前仅支持 macOS ( 14+,Apple silicon )。
欢迎试用,有问题或建议,提 issue 或在楼下留言都可以。