Skip to content

09 · Purge 与 Installer

两个命令都删除“大而可再生”的文件,但风险模型不同:Purge 判断项目活跃度,Installer 验证文件身份在确认后没有变化。

Purge:先证明它是项目

Purge 使用 lib/clean/project.sh 的扫描器,默认只关注 7 天以上、深度 1 到 6 的构建产物。目录必须同时满足项目指示物、精确的产物名称和安全路径条件;monorepo 有额外指示物。

典型目标包括依赖目录、构建输出与工具缓存,但名字相同不代表可删。扫描器会避开云同步目录、识别 CACHEDIR.TAG、过滤嵌套候选,并结合最近活动分类。

扫描根
  └─► 项目标志 + 精确目标名
        └─► 路径/云盘/保护规则
              └─► 活跃度分类 + 嵌套去重
                    └─► 大小、交互选择、确认
                          └─► 删除前重新检查活跃度

确认到执行之间项目可能重新活跃,所以删除前复检,而不是只信扫描时的时间戳。用户自定义扫描路径存入配置,但仍不能绕过安全规则。

Installer:用不可变计划抵抗路径替换

Installer 扫描常见位置的 .dmg.pkg 和安装器压缩包。用户选择后,它构建一份不可变计划,记录规范路径、大小以及存在时的 device + inode。

删除前逐项核对:

  1. 文件是否仍存在;
  2. device/inode 是否仍是同一个对象;
  3. 精确大小是否与确认时一致。

任一条件变化就拒绝该项。这样可以避免用户确认的是旧安装包,执行时同一路径已被新下载替换。最终仍调用 mole_delete,并用独立退出状态表达“部分未完成”。

相同模式,不同证据

维度PurgeInstaller
对象目录型项目产物安装文件
主要证据项目标志、目标名、活跃度扩展名、路径、inode、大小
变化风险项目恢复活动路径指向新文件
最后复检活跃度与路径安全身份与大小
删除汇点mole_deletemole_delete

两者说明“复检”不应做成一个抽象布尔函数。不同对象的关键不变量不同:目录关心是否重新被使用,文件关心是否仍是用户确认的那个 inode。

关键源码索引

下一章转向 Optimize:它不以释放空间为唯一目标,而要表达“应用、无需改变、跳过、不可用、需关注、失败”六种真实结果。

独立源码研究笔记 · 非 Mole 官方文档