最佳实践
最佳实践 {#best-practices}
Section titled “最佳实践 {#best-practices}”在与不同团队和项目合作的这些年里,我们确定了一套在使用 Tuist 和 Xcode 项目时推荐遵循的最佳实践。这些实践不是强制性的,但它们可以帮助你构建更容易维护和扩展的项目。
Xcode {#xcode}
Section titled “Xcode {#xcode}”不推荐的做法 {#discouraged-patterns}
Section titled “不推荐的做法 {#discouraged-patterns}”模拟远程环境的配置 {#configurations-to-model-remote-environments}
Section titled “模拟远程环境的配置 {#configurations-to-model-remote-environments}”许多组织使用构建配置来模拟不同的远程环境(例如 Debug-Production 或 Release-Canary),但这种方法有一些缺点:
- 不一致: 如果整个图中存在配置不一致,构建系统可能最终为某些目标使用错误的配置。
- 复杂性: 项目可能最终得到一长串难以推理和维护的本地配置和远程环境。
构建配置旨在体现不同的构建设置,项目很少需要超过 Debug 和 Release。模拟不同环境的需求可以通过不同的方式实现:
- 在 Debug 构建中: 你可以在应用中包含开发时应可访问的所有配置(例如端点),并在运行时切换它们。切换可以通过方案启动环境变量或应用内的 UI 来进行。
- 在 Release 构建中: 对于发布版本,你只能包含发布版本绑定的配置,不包括使用编译器指令切换配置的运行时逻辑。
::: info 非标准配置
虽然 Tuist 支持非标准配置,并使它们比原生 Xcode 项目更容易管理,但如果配置在整个依赖图中不一致,你将收到警告。这有助于确保构建可靠性并防止配置相关问题。
:::
可构建文件夹
Section titled “可构建文件夹”Tuist 4.62.0 添加了对可构建文件夹(Xcode 的同步组)的支持,这是 Xcode 16 中引入的功能,用于减少合并冲突。
虽然 Tuist 的通配符模式(例如 Sources/**/*.swift)已经消除了生成项目中的合并冲突,但可构建文件夹提供了额外的好处:
- 自动同步:你的项目结构与文件系统保持同步——添加或删除文件时无需重新生成
- AI 友好的工作流程:编码助手和代理可以修改你的代码库而无需触发项目重新生成
- 更简单的配置:定义文件夹路径,而不是管理明确的文件列表
我们建议采用可构建文件夹,而不是传统的 Target.sources 和 Target.resources 属性,以获得更简化的开发体验。
::: code-group
let target = Target( name: "App", buildableFolders: ["App/Sources", "App/Resources"])let target = Target( name: "App", sources: ["App/Sources/**"], resources: ["App/Resources/**"]):::
在 CI 上强制使用已解析的版本
Section titled “在 CI 上强制使用已解析的版本”在 CI 上安装 Swift Package Manager 依赖时,我们建议使用 --force-resolved-versions 标志来确保确定性构建:
tuist install --force-resolved-versions此标志确保使用 Package.resolved 中精确固定的版本解析依赖,从而消除依赖解析非确定性导致的问题。这在 CI 上尤其重要,因为可重现的构建至关重要。