跳转到内容

最佳实践

在与不同团队和项目合作的这些年里,我们确定了一套在使用 Tuist 和 Xcode 项目时推荐遵循的最佳实践。这些实践不是强制性的,但它们可以帮助你构建更容易维护和扩展的项目。

不推荐的做法 {#discouraged-patterns}

Section titled “不推荐的做法 {#discouraged-patterns}”

模拟远程环境的配置 {#configurations-to-model-remote-environments}

Section titled “模拟远程环境的配置 {#configurations-to-model-remote-environments}”

许多组织使用构建配置来模拟不同的远程环境(例如 Debug-ProductionRelease-Canary),但这种方法有一些缺点:

  • 不一致: 如果整个图中存在配置不一致,构建系统可能最终为某些目标使用错误的配置。
  • 复杂性: 项目可能最终得到一长串难以推理和维护的本地配置和远程环境。

构建配置旨在体现不同的构建设置,项目很少需要超过 DebugRelease。模拟不同环境的需求可以通过不同的方式实现:

  • 在 Debug 构建中: 你可以在应用中包含开发时应可访问的所有配置(例如端点),并在运行时切换它们。切换可以通过方案启动环境变量或应用内的 UI 来进行。
  • 在 Release 构建中: 对于发布版本,你只能包含发布版本绑定的配置,不包括使用编译器指令切换配置的运行时逻辑。

::: info 非标准配置

虽然 Tuist 支持非标准配置,并使它们比原生 Xcode 项目更容易管理,但如果配置在整个依赖图中不一致,你将收到警告。这有助于确保构建可靠性并防止配置相关问题。

:::

Tuist 4.62.0 添加了对可构建文件夹(Xcode 的同步组)的支持,这是 Xcode 16 中引入的功能,用于减少合并冲突。

虽然 Tuist 的通配符模式(例如 Sources/**/*.swift)已经消除了生成项目中的合并冲突,但可构建文件夹提供了额外的好处:

  • 自动同步:你的项目结构与文件系统保持同步——添加或删除文件时无需重新生成
  • AI 友好的工作流程:编码助手和代理可以修改你的代码库而无需触发项目重新生成
  • 更简单的配置:定义文件夹路径,而不是管理明确的文件列表

我们建议采用可构建文件夹,而不是传统的 Target.sourcesTarget.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 上安装 Swift Package Manager 依赖时,我们建议使用 --force-resolved-versions 标志来确保确定性构建:

Terminal window
tuist install --force-resolved-versions

此标志确保使用 Package.resolved 中精确固定的版本解析依赖,从而消除依赖解析非确定性导致的问题。这在 CI 上尤其重要,因为可重现的构建至关重要。