1. macOS 磁盘告急:Flutter 与 Xcode 缓存到底吃掉了多少空间
如果你在 macOS 上做 Flutter 或 iOS 开发,大概率经历过这种时刻:某天打开「关于本机」一看,系统数据占了 200 多个 G,可用空间只剩个位数。我最近就遇到一次,df -h显示根分区只剩 3.2G,Xcode 直接拒绝编译,Flutter 的pod install也报磁盘写入失败。
问题不在于你装了多少 App,而在于开发工具链会持续产生「看不见的垃圾」。Xcode 每次编译都会往~/Library/Developer/Xcode/DerivedData写中间产物,模拟器运行一次就生成一份设备镜像,Flutter 的build目录和 pub 缓存也会越滚越大。这些目录散落在用户库深处,Finder 默认不显示,手动翻找基本等于大海捞针。
更麻烦的是,很多目录名字看起来都「像」可以删,但删错了会导致模拟器无法启动、签名失效、甚至项目依赖全部重装。所以真正需要的不是「一键清理」,而是先扫描、再判断、最后有白名单地删。这篇就按这个思路走:先给你一套可复制的扫描脚本,把空间去向摸清楚;再把 Claude 和 Codex 的调用统一改到 TaoToken,让 AI 帮你判断哪些能删;最后用df -h前后对比验证效果。
适合谁看:macOS 开发机磁盘告急的 Flutter/iOS 开发者,尤其是装了多个模拟器、Xcode 版本堆了好几代的人。核心检索词就三个:macOS 磁盘清理、Flutter Xcode 缓存、TaoToken 统一 Key 接入。下面所有命令都可以直接复制执行,但删除类操作我会明确标注「先确认再执行」。
先说结论:我实测下来,一台用了两年的 M 系列 MacBook,光 Xcode 相关缓存就能清出 40–60G,模拟器镜像再贡献 20–30G,加上 Flutter 和终端日志,接近 100G 是合理的。关键是你得知道每一块空间在哪、删了会怎样。
2. TaoToken 前置准备:把 Claude 与 Codex 的 Key 统一收口
在让 AI 帮你判断文件之前,得先解决「用哪个模型、走哪个入口」的问题。我同时用 Claude 和 Codex,如果每个工具都单独配 Key、单独记 Base URL,切换起来很乱,而且排查问题时不知道请求到底发到了哪。TaoToken 的价值就在这里:它提供一个统一的 API 入口,Claude 和 Codex 都通过同一个 Key 调用,配置集中、排查集中。
官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个不加 UTM)。你需要先去控制台创建一个 API Key,路径在 console 里,创建后复制保存,后面配置要用。
这里要强调一个概念:TaoToken 是合规的 API 聚合入口,不是让你去搞什么网络工具,它解决的是「多模型统一调用」的工程问题。你原来的 Claude Code、Codex CLI 都保留,只是把请求地址和 Key 换成 TaoToken 的,模型能力不变。
具体要准备三样东西,我称之为「三件套」:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 所有请求的统一入口 |
| API Key | 控制台创建 | 形如sk-...,只显示一次 |
| Model ID | 按需选择 | Claude 系列或 Codex 对应模型 |
如果你用的是 Claude Code,它读取的是环境变量ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY;如果你用的是 Codex CLI,它读的是~/.codex/auth.json或环境变量。两者都可以指向 TaoToken。这样你在终端里让 AI 扫描磁盘时,不管调的是 Claude 还是 Codex,走的都是同一个 Key,账单和日志也统一。
注意:创建 Key 后不要提交到 Git,也不要写进项目里的明文配置。建议放在 shell 的
~/.zshrc里用环境变量注入,或者用~/.codex/auth.json这种用户级文件。
准备好之后,先别急着扫描磁盘,我们先把配置写对,确保 AI 能正常响应。下一节给可直接复制的配置片段。
3. 可复制配置:Claude Code 与 Codex 接入 TaoToken 的完整片段
这一节是全文最需要照着做的地方。我分两块:Claude Code 的环境变量配置,和 Codex CLI 的auth.json配置。两块都指向同一个 TaoToken Base URL,Key 用你刚创建的那个。
先说 Claude Code。它本质是个 CLI,读取ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。你可以在~/.zshrc里加:
# ~/.zshrc export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的TaoToken密钥"改完执行source ~/.zshrc生效。验证方式是echo $ANTHROPIC_BASE_URL,应该输出https://taotoken.net/api。这一步很关键,如果 Base URL 写错,后面所有请求都会 401 或连接失败。
再说 Codex CLI。它读取~/.codex/auth.json,格式如下:
{ "OPENAI_API_KEY": "sk-你的TaoToken密钥", "OPENAI_BASE_URL": "https://taotoken.net/api" }注意 Codex 的字段名是OPENAI_API_KEY和OPENAI_BASE_URL,不是ANTHROPIC_前缀,别搞混。文件路径必须是~/.codex/auth.json,权限建议chmod 600,避免被其他用户读到。
如果你同时用 Cline 或 CC Switch 这类工具,它们的配置逻辑类似,核心还是三件套:Base URL 填https://taotoken.net/api,Key 填 TaoToken 的 Key,Model ID 按你选的模型填。CC Switch 里通常有「自定义 Provider」选项,把这三项填进去即可。
配置完成后,建议先做一次最小验证,别直接上磁盘扫描。用 Claude Code 发一句:
claude -p "回复 ok"如果返回ok,说明 Base URL 和 Key 都通了。Codex 同理,跑一个简单 prompt 看是否有响应。这一步过了,再进入扫描环节。
提示:如果你之前配过其他 Base URL,记得先清掉旧的环境变量,否则可能被覆盖。用
env | grep -i anthropic和env | grep -i openai检查一下。
配置这件事看起来简单,但 90% 的「AI 没反应」都是这里出的问题。把三件套写对,后面就顺了。
4. 扫描脚本与清理白名单:让 AI 判断哪些能删
现在进入正题。第一步不是删,是扫描。我写了一个可复制的扫描脚本,把 macOS 上最常见的开发缓存目录列出来,统计各自占用空间。你可以直接存成scan_disk.sh:
#!/bin/bash # scan_disk.sh - 扫描 macOS 开发缓存占用 echo "=== 磁盘总览 ===" df -h / echo "" echo "=== Xcode 相关 ===" du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null du -sh ~/Library/Developer/Xcode/Archives 2>/dev/null du -sh ~/Library/Developer/CoreSimulator/Devices 2>/dev/null du -sh ~/Library/Developer/Xcode/iOS\ DeviceSupport 2>/dev/null echo "" echo "=== Flutter 相关 ===" du -sh ~/.pub-cache 2>/dev/null du -sh ~/development/*/build 2>/dev/null echo "" echo "=== 终端与日志 ===" du -sh ~/Library/Logs 2>/dev/null du -sh /private/var/log 2>/dev/null echo "" echo "=== 浏览器缓存 ===" du -sh ~/Library/Caches/Google 2>/dev/null du -sh ~/Library/Caches/com.apple.Safari 2>/dev/null执行bash scan_disk.sh,你会看到每个目录的实际占用。我实测一台机器上DerivedData占了 38G,CoreSimulator/Devices占了 27G,~/.pub-cache占了 6G,加起来已经 70G 出头。
扫描完,把结果贴给 AI,让它判断。这里就是 TaoToken 统一 Key 的用武之地:你可以用 Claude Code 或 Codex 直接分析。给 AI 的 prompt 建议这样写:
以下是我 macOS 开发机的缓存目录占用,请帮我分类: 1. 哪些可以安全删除,删除后不影响开发 2. 哪些需要谨慎,删除后可能影响模拟器或签名 3. 哪些绝对不能删 请勿执行任何删除操作,只做判断。 <粘贴 scan_disk.sh 的输出>AI 通常会给出类似判断:DerivedData可以删,Xcode 会重新生成;CoreSimulator/Devices里未使用的模拟器可以删;~/.pub-cache可以删,下次flutter pub get会重下;iOS DeviceSupport里旧版本可以删;/private/var/log里的旧日志可以清。而Archives要谨慎,里面可能有你要提交 App Store 的归档。
基于这个判断,我整理了一份清理白名单配置,存成clean_whitelist.txt:
# 可安全删除 ~/Library/Developer/Xcode/DerivedData/* ~/Library/Developer/CoreSimulator/Devices/* # 仅未使用的模拟器 ~/.pub-cache/* ~/Library/Logs/* ~/Library/Caches/Google/* # 谨慎删除(先确认) ~/Library/Developer/Xcode/Archives/* # 确认无待提交归档 ~/Library/Developer/Xcode/iOS DeviceSupport/* # 保留当前调试版本 # 禁止删除 ~/Library/Developer/Xcode/UserData/ ~/Library/MobileDevice/Provisioning Profiles/有了白名单,删除就有边界。你可以让 AI 按白名单生成删除命令,但执行前一定自己再看一遍。我踩过的坑是:有一次让 AI 直接删Devices下所有内容,结果把正在用的模拟器也删了,重建花了半小时。所以「未使用」这个条件必须人工确认。
5. 验证请求与 df -h 前后对比:确认真的释放了空间
删除执行完,必须验证两件事:AI 请求是否正常走 TaoToken,以及磁盘是否真的释放。先说请求验证。
在 Claude Code 里跑:
claude -p "用一句话说明 DerivedData 是什么"如果返回正常内容,说明请求经过 TaoToken 成功到达模型。如果报 401,说明 Key 不对;如果报连接失败,说明 Base URL 写错。Codex 同理,跑一个简单 prompt 验证。
再说磁盘验证。删除前先记录一次:
df -h / | tail -1我删除前的输出是:
/dev/disk3s1s1 460Gi 412Gi 3.2Gi 99% /可用空间只有 3.2G。执行清理后,再跑一次:
df -h / | tail -1删除后的输出:
/dev/disk3s1s1 460Gi 318Gi 97Gi 77% /可用空间从 3.2G 涨到 97G,释放了约 94G。这个数字和扫描阶段的估算基本吻合:DerivedData38G + 模拟器 27G + pub 缓存 6G + 日志和浏览器缓存约 20G。
为了更精确,你可以在删除前后分别统计目标目录:
du -sh ~/Library/Developer/Xcode/DerivedData du -sh ~/Library/Developer/CoreSimulator/Devices du -sh ~/.pub-cache删除后这些目录要么为空,要么大幅缩小。注意DerivedData删除后第一次编译会变慢,因为要重建索引,这是正常现象,不是出错。
验证环节还有一个细节:如果你用 Codex 做验证,确认它读的是~/.codex/auth.json而不是旧的环境变量。可以用codex --version加一个简单 prompt 测试。如果两个工具都能正常响应,说明 TaoToken 统一 Key 接入成功,后续你无论用哪个模型分析磁盘,都走同一个入口。
6. 常见报错排查:401、local proxy failed 与 reading choices
这一节把我遇到过的报错和排查路径列清楚,你照着对号入座。
报错一:401 Unauthorized。这是最常见的。原因通常是 Key 写错、Key 过期、或者 Base URL 和 Key 不匹配。排查步骤:先echo $ANTHROPIC_API_KEY确认 Key 存在且没有多余空格;再echo $ANTHROPIC_BASE_URL确认是https://taotoken.net/api;然后去 TaoToken 控制台确认 Key 状态正常。如果是 Codex,检查~/.codex/auth.json里的OPENAI_API_KEY字段名是否写对,很多人写成ANTHROPIC_API_KEY导致读不到。
报错二:local proxy failed。这个报错通常出现在你本地有代理配置残留时。检查env | grep -i proxy,如果有http_proxy或https_proxy指向本地端口,先unset掉再试。TaoToken 的请求不需要经过本地代理,残留配置会干扰连接。
报错三:reading choices 相关错误。这类报错一般是响应格式解析失败,常见于 Model ID 填错。比如你填了一个 TaoToken 不支持的模型名,返回结构对不上,客户端解析choices字段就报错。解决方法是确认 Model ID 拼写正确,Claude 系列和 Codex 对应的模型名不要混用。
报错四:OAuth 相关提示。如果你之前用官方 OAuth 登录过 Claude Code,切到 TaoToken 后可能残留旧凭证。检查~/.claude或相关配置目录,清掉旧的 token 缓存,改用环境变量方式注入 Key。
报错五:权限不足导致扫描不全。这不是 API 报错,但很常见。macOS 需要给终端「完全磁盘访问权限」,路径是系统设置 → 隐私与安全 → 完全磁盘访问权限 → 勾选终端。没有这个权限,du命令读不到某些系统目录,扫描结果会偏小。
排查顺序建议:先确认三件套(Base URL、Key、Model ID),再确认环境变量无残留,最后确认系统权限。大部分问题在前两步就能解决。
7. 把 AI 接入日常清理流程:从一次性操作到可复用脚本
清理一次不难,难的是让它可复用。我的做法是把扫描脚本、白名单、AI 判断串成一个流程,每隔一两个月跑一次。
具体来说,scan_disk.sh固定放在~/scripts/下,白名单clean_whitelist.txt放同目录。每次磁盘告急时,先跑扫描,把输出贴给 Claude Code 或 Codex,让 AI 按白名单给出删除建议,人工确认后执行。因为 Claude 和 Codex 都走 TaoToken 统一 Key,你不需要重新配置,直接调用即可。
如果你想让流程更自动,可以写一个包装脚本,把扫描结果通过 API 发给模型,拿回判断后再人工确认。但我不建议全自动删除,磁盘清理这种事,人工确认那一步不能省。
长期来看,如果你经常用 AI 做这类系统分析和编码任务,可以考虑 Coding Plan,它适合高频调用场景,比单次按量更划算。入口在 https://taotoken.net/api 对应的控制台里可以找到。模型对话入口适合临时验证模型是否正常,接入文档则在你换工具时查配置格式用。
最后给一个实用技巧:把df -h /加进你的 shell 提示符或登录脚本,每次开终端都能看到剩余空间,早发现早清理,不至于等到 Xcode 拒绝编译才动手。清理完记得再跑一次df -h确认,数字不会骗人。