跳到内容

生成的项目

Tuist 生成的项目是一种可行的替代方案,有助于克服这些挑战,同时将复杂性和成本保持在可接受的水平。它将 Xcode 项目视为基本要素,确保对未来 Xcode 更新的弹性,并利用 Xcode 项目生成功能为团队提供以模块化为重点的声明式 API。Tuist 使用项目声明来简化模块化的复杂性,优化跨各种环境的构建或测试等工作流,并促进和普及 Xcode 项目的演进。

它是如何工作的?#

要开始使用生成的项目,你只需使用 Tuist 的领域特定语言 (DSL) 定义你的项目。这需要使用清单文件,例如 Workspace.swift 或 Project.swift。如果你之前使用过 Swift Package Manager,这种方法非常相似。

定义好项目后,Tuist 提供了多种工作流来管理和与项目交互:

  • 生成: 这是基础工作流。使用它来创建与 Xcode 兼容的 Xcode 项目。
  • 构建: 此工作流不仅生成 Xcode 项目,还使用 xcodebuild 进行编译。
  • 测试: 与构建工作流类似,它不仅生成 Xcode 项目,还利用 xcodebuild 对其进行测试。

Xcode 项目的挑战#

随着 Xcode 项目的增长,组织可能会面临生产力下降的问题,原因包括增量构建不可靠、遇到问题的开发人员频繁清除 Xcode 的全局缓存,以及项目配置脆弱。为了保持快速的特性开发,组织通常会探索各种策略。

一些组织选择通过使用基于 JavaScript 的动态运行时(如 React Native)抽象平台来绕过编译器。虽然这种方法可能有效,但它 使访问平台的原生功能变得复杂。其他组织选择 对代码库进行模块化,这有助于建立清晰的边界,使代码库更易于处理,并提高构建时间的可靠性。然而,Xcode 项目格式并非为模块化而设计,会导致隐式配置,很少有人理解且经常发生冲突。这导致人员依赖风险较高,尽管增量构建可能会有所改善,但当构建失败时,开发人员仍可能频繁清除 Xcode 的构建缓存(即派生数据)。为了解决这个问题,一些组织选择 放弃 Xcode 的构建系统 并采用 Buck 或 Bazel 等替代方案。然而,这会带来 高复杂性和维护负担。

替代方案#

Swift Package Manager#

虽然 Swift Package Manager (SPM) 主要关注依赖项,但 Tuist 提供了不同的方法。使用 Tuist,你不仅可以为 SPM 集成定义包;还可以使用熟悉的概念(如项目、工作区、目标和方案)来塑造你的项目。

XcodeGen#

XcodeGen 是一个专用的项目生成器,旨在减少协作 Xcode 项目中的冲突并简化 Xcode 内部工作原理的一些复杂性。但是,项目是使用可序列化格式(如 YAML)定义的。与 Swift 不同,如果不引入其他工具,这不允许开发人员基于抽象或检查进行构建。虽然 XcodeGen 确实提供了一种将依赖项映射到内部表示以进行验证和优化的方法,但它仍然使开发人员暴露于 Xcode 的细微差别中。这可能使 XcodeGen 成为 构建工具 的合适基础,正如在 Bazel 社区中所见,但对于旨在维持健康和高效环境的包容性项目演进来说,它并不是最佳选择。

Bazel#

Bazel 是一个先进的构建系统,以其远程缓存功能而闻名,主要在 Swift 社区中因此能力而流行。然而,鉴于 Xcode 及其构建系统的可扩展性有限,用 Bazel 的系统替代它需要大量的努力和维护。只有少数拥有丰富资源的公司才能承担这种开销,从那些大力投资将 Bazel 与 Xcode 集成的公司名单中可以看出这一点。有趣的是,社区创建了一个 工具,该工具使用 Bazel 的 XcodeGen 来生成 Xcode 项目。这导致了一个复杂的转换链:从 Bazel 文件到 XcodeGen YAML,最后到 Xcode 项目。这种分层间接性通常会使故障排除变得复杂,使问题更难诊断和解决。