09 · Purge 与 Installer
两个命令都删除“大而可再生”的文件,但风险模型不同:Purge 判断项目活跃度,Installer 验证文件身份在确认后没有变化。
Purge:先证明它是项目
Purge 使用 lib/clean/project.sh 的扫描器,默认只关注 7 天以上、深度 1 到 6 的构建产物。目录必须同时满足项目指示物、精确的产物名称和安全路径条件;monorepo 有额外指示物。
典型目标包括依赖目录、构建输出与工具缓存,但名字相同不代表可删。扫描器会避开云同步目录、识别 CACHEDIR.TAG、过滤嵌套候选,并结合最近活动分类。
扫描根
└─► 项目标志 + 精确目标名
└─► 路径/云盘/保护规则
└─► 活跃度分类 + 嵌套去重
└─► 大小、交互选择、确认
└─► 删除前重新检查活跃度确认到执行之间项目可能重新活跃,所以删除前复检,而不是只信扫描时的时间戳。用户自定义扫描路径存入配置,但仍不能绕过安全规则。
Installer:用不可变计划抵抗路径替换
Installer 扫描常见位置的 .dmg、.pkg 和安装器压缩包。用户选择后,它构建一份不可变计划,记录规范路径、大小以及存在时的 device + inode。
删除前逐项核对:
- 文件是否仍存在;
- device/inode 是否仍是同一个对象;
- 精确大小是否与确认时一致。
任一条件变化就拒绝该项。这样可以避免用户确认的是旧安装包,执行时同一路径已被新下载替换。最终仍调用 mole_delete,并用独立退出状态表达“部分未完成”。
相同模式,不同证据
| 维度 | Purge | Installer |
|---|---|---|
| 对象 | 目录型项目产物 | 安装文件 |
| 主要证据 | 项目标志、目标名、活跃度 | 扩展名、路径、inode、大小 |
| 变化风险 | 项目恢复活动 | 路径指向新文件 |
| 最后复检 | 活跃度与路径安全 | 身份与大小 |
| 删除汇点 | mole_delete | mole_delete |
两者说明“复检”不应做成一个抽象布尔函数。不同对象的关键不变量不同:目录关心是否重新被使用,文件关心是否仍是用户确认的那个 inode。
关键源码索引
bin/purge.sh:Purge 参数、选择与编排。lib/clean/project.sh#L262-L745:路径安全、扫描、去重、活动度与计量。lib/clean/project.sh#L1062-L1165:确认与总编排。bin/installer.sh:不可变删除计划与身份复核。
下一章转向 Optimize:它不以释放空间为唯一目标,而要表达“应用、无需改变、跳过、不可用、需关注、失败”六种真实结果。