项目
Tuist 生成的项目是一种可行的替代方案,有助于克服这些挑战,同时将复杂度和成本保持在可接受的水平。它将 Xcode 项目视为基本元素,确保对未来 Xcode 更新的适应性,并利用 Xcode 项目生成为团队提供以模块化为中心的声明式 API。Tuist 使用项目声明来简化模块化的复杂性,优化各种环境下的构建或测试等工作流程,并促进 Xcode 项目的演进和民主化。
要开始使用生成的项目,你只需要使用 Tuist 的领域特定语言(DSL) 定义你的项目。这需要使用 Workspace.swift 或 Project.swift 等清单文件。如果你之前使用过 Swift Package Manager,这种方法非常相似。
定义项目后,Tuist 提供了多种工作流来管理和交互:
- 生成: 这是基础工作流。用于创建与 Xcode 兼容的 Xcode 项目。
构建 : 此工作流不仅生成 Xcode 项目,还使用xcodebuild进行编译。测试 : 与构建工作流类似,不仅生成 Xcode 项目,还使用xcodebuild进行测试。
Xcode 项目面临的挑战
Section titled “Xcode 项目面临的挑战”随着 Xcode 项目的增长,组织可能会因多种因素而面临生产力下降,包括不可靠的增量构建、开发者遇到问题时频繁清除 Xcode 全局缓存,以及脆弱的项目配置。为了保持快速的功能开发,组织通常会探索各种策略。
一些组织选择使用 JavaScript 动态运行时(如 React Native)抽象平台来绕过编译器。虽然这种方法可能有效,但它复杂化了对平台原生功能的访问。其他组织则选择模块化代码库,这有助于建立清晰的边界,使代码库更易于使用,并提高构建时间的可靠性。然而,Xcode 项目格式并非为模块化而设计,导致了隐式配置,只有少数人理解并频繁产生冲突。这导致了糟糕的公交车因子系数,虽然增量构建可能有所改善,但开发者在构建失败时仍可能频繁清除 Xcode 构建缓存(即派生数据)。为此,一些组织选择放弃 Xcode 的构建系统,采用 Buck 或 Bazel 等替代方案。然而,这带来了高复杂度和维护负担。
Swift Package Manager
Section titled “Swift Package Manager”Swift Package Manager(SPM)主要关注依赖管理,而 Tuist 提供了不同的方法。使用 Tuist,你不仅可以为 SPM 集成定义包,还可以使用项目、工作区、目标和 scheme 等熟悉的概念来塑造你的项目。
XcodeGen
Section titled “XcodeGen”XcodeGen 是一款专用的项目生成器,旨在减少协作 Xcode 项目中的冲突并简化 Xcode 内部工作的一些复杂性。然而,项目使用 YAML 等可序列化格式定义。与 Swift 不同,这不允许开发者在不整合额外工具的情况下构建抽象或检查。虽然 XcodeGen 确实提供了一种将依赖映射到内部表示以进行验证和优化的方法,但它仍然让开发者暴露在 Xcode 的细微差别中。这可能使 XcodeGen 成为构建工具的合适基础,如 Bazel 社区所见,但它并非追求保持健康和高效环境的包容性项目演进的最佳选择。
Bazel 是一款高级构建系统,以其远程缓存功能著称,在 Swift 社区中主要因这一能力而受到关注。然而,考虑到 Xcode 及其构建系统的有限可扩展性,用 Bazel 的系统替代它需要大量努力和维护。只有少数资源丰富的公司才能承担这种开销,从大力投资将 Bazel 与 Xcode 集成的公司名单中可以看出。有趣的是,社区创建了一个工具,使用 Bazel 的 XcodeGen 生成 Xcode 项目。这导致了一连串复杂的转换:从 Bazel 文件到 XcodeGen YAML,最终到 Xcode 项目。这种层层间接往往使故障排除变得复杂,问题更难以诊断和解决。