Vibe Coding 会遇到的第一道难关:硬盘空间不足

有 Vibe Coding 经验的朋友应该能理解,随便做一段时间项目,硬盘里的文件就会堆积到数百 GB。除了代码,还有设计稿、素材、演示视频和已经结束的项目归档,而 Mac 的内置硬盘又不能随意扩容,难免会遇到需要频繁清理电脑的窘境。

每天都要清理n次才能运行项目的丐版 MacBook Pro

我原本的办法是外接一块硬盘。但用了一段时间总觉得别扭:平时要多带一个设备,出门可能忘记,万一丢了,里面的文件也可能一起没了。

经历了两周颇为不便的办公体验后,我甚至开始犹豫要不要下单 8TB 硬盘、售价 59999 元的新款 MacBook Pro 来彻底解决问题。

但下单的一刹那,银行卡余额不足的通知让我被迫冷静了下来……

那么,有没有一种办法,既能腾出本地空间,又不用多带一块硬盘?

省流:配置方案请看 https://github.com/belcheckyoung/VibeCodingonCloud

把网盘变成一个普通文件夹

我想到的是网盘。如果能把它映射到本地,在 Finder 里像普通文件夹一样读写,就能把不常用的文件放到云端,也不必多带一块硬盘。当然,正在开发的代码还是留在本地更合适,真正要搬上去的,是那些占地方又不常改动的文件。

恰好我在用阿里云盘,也有 Mountain Duck。它能把远程存储挂载到 Finder,按理说连上 WebDAV 就行。

问题很快出现:我阿里云盘的官方 WebDAV 连接方案只能读取,不能写入。这对看剧没什么影响,但对「把网盘当硬盘用」来说就卡住了。

阿里云盘的 WebDAV 使用说明

我最初的想法是逆向客户端、模拟它的请求。这条路不是完全走不通,但客户端一更新就可能失效,还要用主账号承担风险。继续查资料后发现,其实有一条更稳妥的路:阿里云盘开放平台本身就有授权 API,只差一个能把它转换成 WebDAV 的工具。

最终方案:Mountain Duck 加 OpenList

最后跑通的组合是:用 OpenList 在 Mac 上起一个本地 WebDAV 服务,再让 Mountain Duck 连接它。

三个角色分工很清楚:

  • Mountain Duck: 把 WebDAV 挂载到 Finder,负责我们平时看到的文件夹体验。
  • OpenList: 运行在本机的网关,对上提供 WebDAV,对下调用网盘接口。它的阿里云盘 Open 驱动基于官方授权 API 开发。
  • launchd: macOS 自带的后台服务管理,安排两者的启动顺序。这一点听起来不起眼,却是我踩得最深的坑。

这套思路也不只适用于阿里云盘。OpenList 的支持列表还包括百度网盘、夸克、115、OneDrive、Google Drive、Dropbox、S3、SMB 等。不过我只实测了阿里云盘,其他存储能否写入、需要什么会员,都要先看对应驱动的文档并自己测试。

配置教程

下面以阿里云盘为例。如果你用其他网盘,第 2、3 步要换成对应驱动的配置,其他步骤大体通用。

开始前的准备

  • 会员权益: 第三方应用权益包和 SVIP 是两套权益,OpenList 属于第三方应用。我两个都开了,建议先在阿里云盘 App 里确认当前规则。
  • 软件: Homebrew 和 Mountain Duck。
  • 令牌方式: 我用的是 OpenList 提供的在线参数,配置最快,但令牌获取和续期会经过它的在线服务。如果介意,可以注册自己的开放平台应用。

1. 安装 OpenList

brew install openlist
openlist admin random --data ~/.openlist
openlist server --data ~/.openlist

第二条命令会生成管理员密码,记得存好。第三条启动后按 Ctrl+C 停止,再把它改成只允许本机访问:

sed -i '' 's/"address": "0.0.0.0"/"address": "127.0.0.1"/' ~/.openlist/config.json
openlist server --data ~/.openlist

看到 start HTTP server @ 127.0.0.1:5244 就成功了。这个窗口先保持打开。

2. 获取刷新令牌

打开 api.oplist.org,选择「阿里云盘 - 验证登录 (OAuth App)」,勾选「使用 OpenList 提供的参数」,完成授权后复制 Refresh Token。

这个令牌相当于云盘的访问凭据,不要发给别人。万一泄露,可以在阿里云盘 App 的授权管理里解除 OpenList 授权。

3. 添加云盘

打开 http://127.0.0.1:5244,登录后添加存储:

字段填写内容
驱动AliyundriveOpen
挂载路径/aliyun
根文件夹 IDroot
刷新令牌上一步的 Refresh Token
Use online api开启
Api url addresshttps://api.oplist.org/alicloud/renewapi
移除方式Trash

保存后状态应显示 Working。如果看不到文件,可以切换「资源库」和「备份盘」试试。

4. 开启 WebDAV 写入权限

在用户设置里勾选 WebDAV read 和 WebDAV manage。没开 WebDAV manage 会返回 403。

保存前看一眼浏览器的自动填充:密码框要保持为空,弹窗也不要挡住复选框。

5. 先用命令行测试

先别急着连 Mountain Duck,这样出错时更容易判断问题在哪一层。先运行第一条并输入密码:

read -s "PW?输入 OpenList 密码: "; echo

再运行(把 用户名 换成你的):

echo "webdav write test" > /tmp/openlist-test.txt
curl -u "用户名:$PW" -T /tmp/openlist-test.txt http://127.0.0.1:5244/dav/aliyun/openlist-test.txt -w "\nHTTP %{http_code}\n"
unset PW

返回 HTTP 201 或 204,就说明写入没问题。

6. 连接 Mountain Duck

新建书签,协议选 WebDAV (HTTP),不要选 HTTPS:

字段填写内容
服务器127.0.0.1
端口5244
用户名、密码OpenList 的账号密码
路径/dav/aliyun

这里的 HTTP 流量只在本机内部传输。连接后,在 Finder 里试试上传、改名、移动和删除。

7. 配置开机自启

这一步很关键。OpenList 如果跑在终端窗口里,窗口一关就停;Mountain Duck 如果先启动,又会错过登录。

先在第 1 步的终端窗口按 Ctrl+C 停止 OpenList,再让 launchd 接管它:

P="$HOME/Library/LaunchAgents/org.openlist.server"
mkdir -p ~/.openlist/launchd-logs
defaults write "$P" Label org.openlist.server
defaults write "$P" ProgramArguments -array "$(command -v openlist)" server --data "$HOME/.openlist"
defaults write "$P" RunAtLoad -bool true
defaults write "$P" KeepAlive -bool true
defaults write "$P" StandardOutPath "$HOME/.openlist/launchd-logs/out.log"
defaults write "$P" StandardErrorPath "$HOME/.openlist/launchd-logs/err.log"
xattr -d com.apple.quarantine "$P.plist" 2>/dev/null
launchctl bootstrap "gui/$(id -u)" "$P.plist"

然后关闭 Mountain Duck 自己的「登录时启动」,改成等 OpenList 就绪后再打开:

A="$HOME/Library/LaunchAgents/org.openlist.mountainduck"
defaults write "$A" Label org.openlist.mountainduck
defaults write "$A" RunAtLoad -bool true
plutil -insert ProgramArguments -xml '<array><string>/bin/sh</string><string>-c</string><string>until /usr/bin/curl -fs -o /dev/null http://127.0.0.1:5244/ping; do sleep 1; done; sleep 3; /usr/bin/open -a "Mountain Duck"</string></array>' "$A.plist"
xattr -d com.apple.quarantine "$A.plist" 2>/dev/null
launchctl bootstrap "gui/$(id -u)" "$A.plist"

最后重启一次 Mac,不要手动连接,直接往挂载目录放一个小文件。文件能自动出现在阿里云盘里,才算真正配置完成。

哪些文件应该放上去

配置成功后很容易产生一个冲动:把整个开发目录都扔进去。我就这么做过,结果 AI 工具的配置备份和会话记录也跟着上传了。这类文件可能包含敏感信息,还是一堆小文件,上传也慢。

文件类型建议位置原因
设计稿、素材、文档、导出成果云盘体积大、改动少
已经结束的项目归档云盘最能腾出空间
正在开发的代码本地,用 Git 同步需要快速读写,也有完整的版本记录
.git、node_modules、缓存、构建产物本地小文件多,且大多可以重新生成
令牌、API 密钥、.env、AI 工具配置本地可能包含敏感信息
正在运行的数据库本地同步中的文件可能不一致

让 Claude 或 GPT 帮你改存储位置

如果想把某个工具的默认存储位置改到云盘,建议让 AI 先盘点,而不是直接动手。下面是我根据这次教训整理的提示词,还没有经过完整实测:

我已把网盘挂载到 Mac,路径是 <挂载路径>。
我想把 <工具名称> 的默认存储位置改到 <目标目录>。

先只做只读盘点,不要修改、移动或删除文件:
1. 按官方文档确认修改方法,并给出链接。
2. 列出当前路径、总体积和文件数。
3. 标出可能含凭据或会话记录的路径,不要打开或输出内容。
4. 指出不适合放云盘的目录。
5. 给出迁移和回滚方案,区分事实和推测,然后等我确认。

我确认后,先复制一个小目录测试,不删除原文件。
密码和令牌都由我自己输入。

最终效果与局限

最后的效果是:开机后 OpenList 自动运行,Mountain Duck 随后打开,我把文件拖进 Finder 里的挂载目录,它就会上传到阿里云盘。我测试了一次重启,没有手动连接,文件也成功上传了。

它很好用,但并不能完全替代本地硬盘:

  • 小文件很慢: 我实测每个小文件约需 2 到 3 秒,因为每个文件都要上传再改名。代码仓库并不适合这样同步。
  • 依赖网络和会员规则: 没有网络时不能指望它实时同步,网盘权益也可能调整。
  • 多了一个常驻服务: OpenList 持有云盘写入权限,密码和令牌都要保管好。它的日志里也可能出现访问令牌,不要原样外传。
  • 文件安全不能只靠它: 确认云端文件完整前,不要删除本地原文件;重要资料仍应有其他备份。

几 GB 的大文件上传我还没有专门测试,如果你主要放视频素材,建议先用一个文件试试速度和完整性。

我踩过的坑

出问题时,建议按这个顺序排查:OpenList 是否运行 → curl 能否写入 → Mountain Duck 能否登录 → 同步队列是否卡住。日志分别在 ~/.openlist/log/ 和 ~/Library/Logs/Mountain Duck/。

现象原因解决方法
重启后一直返回 401Mountain Duck 比 OpenList 早启动 2 秒,错过了登录先重新连接,不要急着改密码;再按第 7 步调整顺序
所有文件都传不上去队列最前面的任务反复失败,我遇到的是一个空文件夹重试了约 5.8 万次看日志,先解决排在最前面的失败任务
WebDAV 返回 403没有开启 WebDAV manage重新勾选保存,并再次确认是否生效
连到 443 被拒绝协议选成了 WebDAV (HTTPS)改成 HTTP,端口填 5244
curl 返回 HTTP 000测试文件不存在,或 OpenList 没运行看状态码上方的具体报错
命令停在 heredoc>长段粘贴被截断按 Ctrl+C 退出,重新执行
brew services 报错Homebrew 的这个包没有提供服务定义改用 launchd
Bootstrap failed: 5我遇到过隔离标记和配置缺少启动程序两种情况用 xattr 和 plutil -p 检查

其中最值得记住的是第一条:401 看起来是密码错误,实际却是启动顺序的问题。我最后是对比两边日志的时间,再通过「只重连、不改密码」验证,才找到原因。如果你也让 AI 帮忙排障,建议让它同样拿出日志证据,每次只改一个变量。

写在最后

这套方案没有把网盘变成一块真正的硬盘,也替代不了那台 8TB 的 MacBook Pro。但对我来说,它解决了最烦的部分:不常用的大文件有了去处,出门不用惦记那块移动硬盘,银行卡也暂时保住了。

如果你也在为 Mac 的存储空间发愁,不妨先从一个归档文件夹开始试。

参考资料: OpenList、阿里云盘 Open 驱动文档、OpenList 安装文档