ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RemoveMacAI 源码剖析:不到 500 行 Swift 如何完成 CLI 解析、状态轮询与零副作用 selftest 自检

RemoveMacAI 源码剖析:不到 500 行 Swift 如何完成 CLI 解析、状态轮询与零副作用 selftest 自检 RemoveMacAI 源码剖析不到 500 行 Swift 如何完成 CLI 解析、状态轮询与零副作用 selftest 自检【免费下载链接】RemoveMacAITurn off Apple Intelligence on macOS 27 and get its disk space back. One command, fully reversible.项目地址: https://gitcode.com/gh_mirrors/re/RemoveMacAIRemoveMacAI 是一款面向 macOS 27 的命令行工具用一条命令关闭 Apple IntelligenceApple 智能并删除已下载的模型轻松回收约 12 GB 磁盘空间且所有改动可随时撤销。整个核心逻辑只用 7 个 Swift 源文件、约 600 行代码实现不依赖任何第三方框架——对想学习如何开发命令行工具CLI的新手来说它是罕见的小而完整范本从参数解析、系统状态轮询到零副作用的 selftest 自检全都有真实可抄的作业。 本文所有源码均位于 Sources/removemacai/ 目录逐行对照阅读即可。项目结构总览7 个文件各司其职先看全貌。Package.swift 声明了一个可执行目标removemacai和一个桥接目标 UAF用 ObjC 运行时 API 对接苹果私有资源服务。Swift 侧分工极其清晰文件行数职责main.swift58命令行参数解析、分发子命令Commands.swift219四个子命令的业务流程与状态轮询Catalog.swift123声明式数据13 个功能 ↔ 开关 ↔ 模型集System.swift136查询磁盘模型大小、调用资源服务删除Profile.swift89生成/检测 macOS 描述文件SelfTest.swift61零副作用 selftest 自检Term.swift38终端着色、对齐、确认提问没有网络请求、没有数据采集见 README.md 的 How it works 一节每个文件都在 250 行以内这正是它能被完整读懂的原因。命令行参数解析10 行手写解析器胜过重型库很多新手以为写 CLI 必须引入 ArgumentParser 之类的库。main.swift 展示了另一条路两个极小工具函数就够了。核心写法main.swift#L18-L29func flag(_ name: String) - Bool { ... } // 消费 --dry-run 这类开关 func option(_ name: String) - String? { ... } // 消费 --keep a,b 这类带值选项思路是把参数数组当成一个队列谁认领谁负责把它从队列里拿走。之后主程序只剩一个干净的switchmain.swift#L35-L57status→ 只读状态永远安全off/ 无参数 → 主流程支持--keep、--dry-run、--yesrevert/on→ 撤销一切selftest→ 自检其余未知输入 → 打印 usage 并以退出码 1 结束几个新手容易忽略的细节未知选项会显式报错main.swift#L43——解析完已知选项后若队列里还有残留直接Term.fail(unknown option ...)而不是静默忽略版本号门禁放在最前main.swift#L31-L33不支持的 macOS 版本立刻失败连selftest都能绕过此限制运行帮助文本就是一个字符串常量无需任何框架。 借鉴点对于选项不超过 5 个的工具手写解析器比引入依赖更简单、更可维护。状态读取把功能开关状态归纳成三态removemacai status是新手最该先读的命令。它把 13 个功能的开关状态来自 Catalog.swift 的声明式清单归纳为一个三态枚举System.swift#L91-L93enum FeatureState: Equatable { case lockedOff, off, on // 被描述文件锁定关闭 / 已关闭 / 开启中 }判断逻辑Settings.state体现了分层思想先看配置项是否被强制forced——即是否由 RemoveMacAI 的描述文件锁定再看当前实际值是否等于关闭值最妙的是纯模型类功能如 Xcode 代码补全没有独立开关只要模型文件还在磁盘上就算开启。另外System.swift#L35-L43 给资源服务的设备清单查询加了1 秒 TTL 缓存——一次status要遍历 5 个模型集缓存避免了重复系统调用。这是小工具里也值得学的性能意识。状态轮询waitFor 如何优雅地等用户点按钮这是整个项目最有教育价值的设计。macOS 要求用户手动在系统设置里批准/移除描述文件命令行程序必须等。Commands.swift#L203-L218 的waitFor是答案static func waitFor(_ what: String, _ condition: () - Bool, minutes: Double 10) - Bool { let spinner Array(⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏) let deadline Date().addingTimeInterval(minutes * 60) ... while Date() deadline { if condition() { return true } if Term.color { print(\r ...spinner...) ; fflush(stdout) } Thread.sleep(forTimeInterval: 0.5) } return false }拆解这个状态轮询器的四个要素条件闭包注入waitFor本身不关心等什么调用方传入() - Bool。安装描述文件时传描述文件是否已生效Commands.swift#L139删模型时传磁盘占用是否为 0Commands.swift#L157deadline 而非固定次数默认等 10 分钟超时返回false让调用方决定善后提示用户稍后重跑程序永远不挂死\r单行刷新 braille 转轮\r回到行首、[K擦除旧内容用 12 个 braille 字符做加载动画纯终端字符就能有动的感觉非终端自动降级Term.swift#L4-L8 尊重NO_COLOR/CLICOLOR_FORCE环境变量和 TTY 检测管道输出时动画自动消失不会被转义码污染。off主流程Commands.swift#L70-L165是先断水源、再清池塘Step 1安装描述文件关闭 13 项功能并把每个模型集的下载地址改写到https://127.0.0.1:9/这个不存在的本地端口Profile.swift#L11-L15macOS 从此无法再下载模型Step 2轮询等待描述文件生效后才调用资源服务删除已下载的模型最后再轮询一次确认磁盘占用归零然后打印实际释放的空间。顺序不能颠倒——先删模型而不封下载macOS 会随时把模型请回来。零副作用 selftest不碰系统也能验证核心逻辑SelfTest.swift 只有 61 行却是全文最精华的部分。运行removemacai selftest即可main.swift#L49-L50它不安装描述文件、不删除任何模型、不请求网络只验证绝不能出错的纯逻辑目录规则全关时删除全部 5 个模型集保留 writing-tools 时它需要的基础模型必须留下而空间照片模型照常删除SelfTest.swift#L16-L22防御性删除空列表和未知模型集必须在发出任何请求前被拒绝——因为资源服务把空列表理解为删掉所有集合这是真实踩过的坑UAF.h#L11-L14 的注释与 System.swift#L63-L70 的三重校验清单解析喂一段虚构的资产清单数据验证只统计isPresentOnDevice: true的资产SelfTest.swift#L28-L34描述文件结构把Profile.data()生成的 XML 反序列化回来断言 Writing Tools 与 Siri 确实被关、5 个下载集全被封到127.0.0.1:9、所有 UUID 唯一SelfTest.swift#L36-L58。支撑UUID 唯一且稳定断言的是 Profile.uuid每个 payload 的 UUID 由其 identifier 做 SHA-1 派生类 v5 风格同一个名字永远得到同一个 UUID所以重复安装新版本描述文件是替换而非新增。自检框架本身只有两个函数SelfTest.swift#L6-L14check(_:_:)计数并打印 pass/FAILthrowsFailure专门验证某操作必须抛出 Failure。全程纯数据进出CI 里跑它零成本、零风险——这就是零副作用自检的完整含义。架构小结小代码量的三个可迁移经验 声明式数据驱动行为Catalog.swift 把哪个功能受哪些 restriction 键、哪些偏好域控制、依赖哪些模型集写成纯数据表删模型时按保留功能仍依赖该模型集就跳过的规则推导Catalog.swift#L117-L122。加一个新功能只改数据不改流程轮询器抽象成通用工具waitFor(条件, 时长)让等用户点击、等文件删除复用同一份代码带超时、带动画、可降级把逻辑拆成纯函数好测目录推导、清单解析、描述文件生成都不依赖真实系统状态selftest 才能做到零副作用。配合 UAF 桥接层查不到就失败关闭的防御风格UAF.h#L5小工具也有企业级的健壮性。想动手体验先removemacai selftest看全绿输出再removemacai status观察状态轮询的实时效果然后按 README.md 的指引阅读完整用法与撤销方式——removemacai revert一条命令即可恢复原状。【免费下载链接】RemoveMacAITurn off Apple Intelligence on macOS 27 and get its disk space back. One command, fully reversible.项目地址: https://gitcode.com/gh_mirrors/re/RemoveMacAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表