自动化与脚本
维护 Tuist + SwiftUI 的 macOS…
适用于创建、重构或审查基于 Tuist 和 SwiftUI 的 macOS 菜单栏(LSUIElement)工具,并需要本地构建/启动可靠、网络与状态逻辑可测试。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
维护 Tuist + SwiftUI 的特定
解决思路
- 默认将应用保持为仅菜单栏;除非明确要求,否则使用 LSUIElement = true。
- 将传输和解码逻辑放在视图之外;不要在 SwiftUI view body 中调用网络。
- 将状态转换放在 Store 层,例如 @Observable 或等价物,不要放在 row/view 展示代码中。
- 模型解码要对 API 漂移有韧性:使用可选字段、安全回退和防御性解析。
- 将 Tuist manifest 视为唯一事实来源;不要依赖手工编辑生成的 Xcode 产物。
- 当 tuist run 对 macOS target/device 解析不可靠时,本地迭代优先使用基于脚本的启动。
- 在本地运行脚本中构建生成项目时,优先使用 tuist xcodebuild build 而不是直接调用原始 xcodebuild。
- 按默认放置方式使用文件:Project.swift 放 app target、设置、资源、Info.plist 键。
- 按默认放置方式使用文件:Sources/*Model*.swift 放 API/领域模型和解码。
- 按默认放置方式使用文件:Sources/*Client*.swift 放请求、响应映射、传输关注点。
- 按默认放置方式使用文件:Sources/*Store*.swift 放可观察状态、刷新策略、过滤、缓存。
- 按默认放置方式使用文件:Sources/*Menu*View*.swift 放菜单组合和顶层 UI 状态。
- 按默认放置方式使用文件:Sources/*Row*View*.swift 放行渲染和轻量交互。
- run-menubar.sh 作为本地 restart/build/launch 的规范路径。
- stop-menubar.sh 在需要时作为显式 stop helper。
- 确认 Tuist 归属:验证 Tuist.swift 和 Project.swift 或 workspace manifests 存在。
- 在改变启动行为前阅读现有运行脚本。
- 在编码假设前探测后端行为:用 curl 验证端点形态、鉴权要求、分页行为。
- 如果端点忽略 limit/page,在 Store 中实现全量列表处理并在本地裁剪。
- 从底层到顶层实现各层:先定义或调整模型。
- 接着添加或更新客户端请求与解码逻辑。
- 然后更新 Store 刷新、过滤、缓存策略。
- 最后接线视图。
- 保持应用接线最小化:应用入口仅专注 scene/menu 接线和依赖注入。
- 避免在 App 或 menu scene 声明中嵌入业务逻辑。
- 标准化启动体验:确保运行脚本在重新启动前重启已有实例。
- 确保运行脚本不会作为副作用打开 Xcode。
- 当需要生成时使用 tuist generate --no-open。
- 当运行脚本构建生成项目时,优先使用 TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build ...,而不是直接调用原始 xcodebuild。
- 编辑后运行验证:TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build -scheme <TargetName> -configuration Debug。
- 如果启动工作流改变,运行 ./run-menubar.sh。
- 如果 shell 脚本改变,运行 bash -n run-menubar.sh。
- 如果 shell 脚本改变,运行 bash -n stop-menubar.sh。
- 如果 shell 脚本改变,运行 ./run-menubar.sh。
- 若 tuist run 无法解析 macOS destination,使用 run/stop scripts 作为规范本地运行路径。
- 若刷新后菜单 UI 卡顿或不一致,将派生状态和过滤移入 Store,并让视图保持只负责渲染。
- 若 API 负载变化导致解码失败,用可选字段和默认值放宽模型解码,然后在 UI 中安全展示缺失数据。
- 若需求要求快速打 UI 补丁,先在 model/client/store 中追踪根因,再修改 row/menu 展示。
- 完成清单:除非明确更改,否则保持仅菜单栏行为。
- 完成清单:保持网络和状态逻辑不在 SwiftUI view body 中。
- 完成清单:保持 Tuist manifests 和运行脚本与实际构建/运行流程一致。
- 完成清单:对触及区域运行验证矩阵。
- 完成清单:报告实际运行的命令和结果。
适用边界 · 注意事项
- 不适用于非 macOS 菜单栏应用,或明确需要普通窗口、Dock 图标的应用。
- 不适用于未使用 Tuist/SwiftUI,或必须采用 Xcode-first 工作流的项目。
- 不适用于无法在 macOS 本地执行 tuist、xcodebuild 和 Shell 脚本的环境。