simslim CI预检与漂移检测:doctor和verify如何守护iOS模拟器配置一致性 simslim CI预检与漂移检测doctor和verify如何守护iOS模拟器配置一致性【免费下载链接】simslimRun more iOS simulators on one Mac by disabling background daemons a simulator doesnt need项目地址: https://gitcode.com/gh_mirrors/si/simslimsimslim 是一款通过关闭模拟器不需要的后台守护进程、让一台 Mac 运行数倍更多 iOS 模拟器的开源工具。而doctor和verify是它面向 CI 场景的两个守护命令doctor在测试运行前做预检确认你的测试所依赖的功能推送、StoreKit、通用链接等在瘦身后的模拟器上依然可用verify则做漂移检测确认模拟器的瘦身配置与你的 profile 完全一致不一致时以非零退出码阻断流水线让脚本立即发现问题。 为什么模拟器的瘦身配置会悄悄漂移用simslim on瘦身后的模拟器其关闭状态是逐设备持久化的写在模拟器自己的 launchd 数据库中。但以下操作会让配置打回原形模拟器被删除后重新创建或执行了erase使用了新安装/更新后的 iOS 运行时创建设备换机器或迁移模拟器profile 不随设备迁移。关键在于这些情况不会报错模拟器只是安静地变重了——内存回到 4 GB 量级能同时跑的设备数量悄悄缩水。对 CI 来说这正是最需要被检测出来的隐患。doctor和verify就是为此设计的两道闸门。一台 Mac 上同时运行 19 个瘦身后的 iOS 模拟器正是 simslim 带来的并行能力而 doctor 与 verify 确保这份能力始终真实有效 doctor一条命令完成 CI 预检doctor回答的问题是我的测试需要的功能还活着吗simslim 内置了一份比瘦身分类更细的功能目录Features每个功能只映射支撑它所需的守护进程例如推送只需com.apple.apsd而 StoreKit 内购需要 storekitd、AMS 账户、Wallet 等多个守护进程协同。目录定义在 features.go 中测试 features_test.go 还保证其中每个守护进程都必须是 simslim 允许管理的标签避免检测一个根本不可能被关掉的进程。列出全部可检测功能支持--jsonsimslim doctor --list运行预检用--requires指定测试依赖的功能simslim doctor udid --requires push,storekit,universal-links任一功能有守护进程被禁用时输出BROKEN并以非零码退出天然适合作为 CI 的 preflight 步骤udid: 2/3 required features OK ok push ok universal-links BROKEN storekit — com.apple.storekitd disabled函数拼写错误会响亮地失败——ResolveFeatures遇到未知功能 ID 直接报错而不是静默放过详见 features.go。命令的入口逻辑在 cmd/simslim/main.go 的cmdDoctor中。 verify漂移检测与一键修复verify回答的是另一个问题这台模拟器是否精确处于我配置的状态它读取模拟器当前的 launchd 禁用覆盖与 profile 期望的状态做精确比对只统计 simslim 管理的标签管理范围之外的标签从不计入漂移。核心实现在 verify.go 的VerifyProfile与compareDisabled中命令入口是 cmd/simslim/main.go 的cmdVerify。simslim verify udid --profile ci.json发现漂移时它会列出两类问题并以非零码退出missingprofile 要求禁用、当前却是启用状态最典型的被重置回出厂extraprofile 之外多禁用了受管理的标签。由于simslim on是幂等的只补齐差量检测与修复可以串成一条自愈流水线simslim verify udid --profile ci.json || simslim on udid --profile ci.jsonverify本身是只读的绝不改动模拟器修复动作完全交给on完成。profile 文件本身由 profile_file.go 负责加载与校验except/keep字段写错会直接拒绝保证比对基准可信。 doctor 与 verify一张表看懂区别维度doctorverify回答的问题我测试需要的功能还能用吗配置和我写的 profile 完全一致吗检查依据功能目录--requires指定你传入的--profile/--except/--keep典型触发场景测试启动前的 preflight设备重建/擦除后的配置审计发现问题的表现某功能守护进程被禁用BROKENmissing / extra 漂移清单修复方式重新simslim on并调整 except/keep重新simslim on幂等补齐JSON 输出✅--json✅--json两者的机器可读结构都是稳定契约DoctorOutput/FeatureStatus定义在 output.gomacOS 应用 gui/Backend.swift 也依赖同一份 JSON方便你在自己的脚本里直接解析。 源码导读预检与漂移检测是怎么实现的想深入了解时按这条路径阅读即可features.go ——Features功能目录与DiagnoseFeatures诊断逻辑某功能只要有一个守护进程被关即判 BROKENverify.go ——VerifyProfile要求设备处于 Booted 状态后读取禁用集与期望集做双向差集output.go ——DoctorOutput、VerifyResult等 JSON 契约结构cmd/simslim/main.go ——cmdDoctor/cmdVerify两个命令入口负责参数解析、退出码与人类可读输出features_test.go —— 关键不变量测试所有功能标签必须可瘦身防止功能目录与瘦身分类脱节。 新手常见问题Q两个命令都要求模拟器处于什么状态A都必须已启动Booted。launchd 的禁用状态只能在运行时读取未启动时命令会直接报错提示。Qverify 会修改模拟器吗A不会。它是纯只读比对修复动作由幂等的simslim on完成重复运行安全。Q在 CI 中如何接入门禁A直接用退出码——doctor/verify失败即非零退出需要程序化解析时加--jsonstdout 输出纯 JSON进度信息走 stderr两者互不干扰。Q瘦身状态会在重启后丢失吗A在 iOS 18.5 的运行时上禁用覆盖会持久化重启后依然瘦身更老的运行时需要--no-reboot路径且每次重启后需重新执行。更多背景见 docs/category-memory.md 与 README.md 中的 How it works 章节。小结doctor守住功能可用verify守住配置一致。两条命令加一个幂等的on就构成了 iOS 模拟器 CI 环境里完整的一致性护栏——配置漂移不再悄无声息。【免费下载链接】simslimRun more iOS simulators on one Mac by disabling background daemons a simulator doesnt need项目地址: https://gitcode.com/gh_mirrors/si/simslim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考