Exodrive 开发环境缓存外置迁移工具概念图

解决日常开发中的具体痛点

现代软件工程工具链对内置固态硬盘(SSD)的吞吐与容量消耗极为激进:

  1. 缓存体积庞大:日常同时写前端、Rust、Go 与容器应用,~/.cargo、~/.pnpm-store、GOCACHE 以及 Docker / OrbStack 磁盘镜像随随便便就能堆出 100GB 到 200GB 的缓存;
  2. Mac 黄金硬盘代价高昂:购买苹果设备时,额外加装 1TB 内置存储的成本极高,而外置雷电或 USB4 固态硬盘(SSD)在性能几乎无损的同时,单位成本只有前者的零头;
  3. 手工软链接容易踩坑:很多开发者尝试手动 ln -s 软链接目录,但一旦遇到跨卷硬链接(如 pnpm store 与工作区处于不同卷)、工具官方环境变量冲突、或在正在运行的进程下移动数据,轻则编译报错,重则损坏镜像。

为了让开发缓存安全、无痛且可逆地迁移到外置移动固态硬盘,我写了 Exodrive。


核心设计:五步确定性迁移流水线

Exodrive 不是一个盲目的文件移动脚本。每种工具链的迁移严格遵循相同的五步闭环:

  1. 拷贝(Copy):流式复制缓存目录至外置目标卷,保留所有原始文件权限、POSIX 属性与修改时间戳;
  2. 逐字节校验(Verify):遍历并比对源目录与目标目录的每个文件。若出现任意一处哈希或字节不一致,流程立即中止,本地原始数据毫发无损;
  3. 账本记录(Ledger):将迁移元数据与状态原子写入本地账本(~/.exodrive/manifest.json);
  4. 工具切换(Switch):
    • 优先使用工具官方原生配置命令(如 npm config set cache、pnpm config set store-dir、go env -w GOCACHE=...、OrbStack data_dir);
    • 对不支持官方重定向配置的工具(如 Cargo、Bun、Colima),采用原子软链接定向至外置副本;
  5. 安全回收(Reclaim):确认一切就绪后,删除本地冗余副本,即刻释放数十上百 GB 的宝贵内置存储。

随时可逆的回滚保证:回滚(exodrive rollback)完全沿相反路径执行——从外置磁盘复制回本地、校验完整性、恢复默认配置并注销账本。任何未登记在账本中的操作,系统坚决拒绝擅自修改。


安全防线与 Fail-Closed 原则

数据安全永远高于便利性。当存在数据受损或语义模糊的风险时,Exodrive 严格执行 Fail-Closed 策略,直接拒绝执行:

  • 文件系统白名单保护:仅允许将缓存迁入现代可靠的文件系统(如 macOS 的 APFS / HFS+,以及 Linux 的 ext4、btrfs、zfs、xfs 等),严格拒绝 exFAT、FAT32 与 NTFS,杜绝跨卷硬链接失效或 POSIX 权限丢弃;
  • 进程互斥检查:当检测到目标包管理器或 Docker 引擎正在运行时,强行阻断迁移,防止并发写入导致数据脏读;
  • 二进制与执行环境隔离:仅迁移缓存数据,绝不移动 ~/.cargo/bin、~/.bun/bin 或 $GOPATH/bin,确保终端 CLI 路径无依赖污染;
  • 孤儿缓存探测:支持一键扫描由于此前手动配置残留的历史废弃缓存(exodrive orphans),安全回收历史磁盘碎片。

交付形态

Exodrive 由 Go 1.27 构建,提供双重交互形态:

  1. 命令行 CLI(exodrive):单静态二进制,支持 scan、migrate、rollback、check、orphans 等高密度操作,并附带彩色终端实时进度条;
  2. macOS 原生轻量窗口(exodrive-gui):基于原生窗口组件构建,实时监控各工具链缓存大小、迁移状态与磁盘占用,支持一键视窗化迁移。

项目资源与文档