跳转到内容

迁移 Swift 包

迁移 Swift 包 {#migrate-a-swift-package}

Section titled “迁移 Swift 包 {#migrate-a-swift-package}”

Swift Package Manager 最初是作为 Swift 代码的依赖管理器而出现的,后来无意中发现自己还解决了项目管理问题,并支持 Objective-C 等其他编程语言。由于该工具的设计初衷不同,使用它来管理大规模项目可能具有挑战性,因为它缺乏 Tuist 提供的灵活性、性能和强大功能。这在 Scaling iOS at Bumble 文章中有很好的说明,其中包含以下比较 Swift Package Manager 和原生 Xcode 项目性能的表格:

A table that compares the regression in performance when using SPM over native Xcode projects

我们经常遇到开发者和组织质疑 Tuist 的必要性,他们认为 Swift Package Manager 可以扮演类似的项目管理角色。有些人尝试迁移,但后来发现他们的开发者体验显著下降。例如,重命名一个文件可能需要长达 15 秒来重新索引。15 秒!

苹果是否会将 Swift Package Manager 打造成专为规模化设计的项目管理器尚不确定。 然而,我们没有看到任何迹象表明它正在发生。事实上,我们看到的恰恰相反。他们正在做出 Xcode 启发的决策,比如通过隐式配置实现便利性,正如你可能知道的,这是规模化复杂性的根源。我们认为,苹果需要回到基本原则,并重新审视一些在作为依赖管理器时有意义但作为项目管理器时没有意义的决定,例如使用编译语言作为定义项目的接口。

::: tip SPM 仅仅作为依赖管理器

Tuist 将 Swift Package Manager 视为依赖管理器,而且它是一个很好的依赖管理器。我们使用它来解析依赖项并构建它们。我们不使用它来定义项目,因为它不是为此而设计的。

:::

从 Swift Package Manager 迁移到 Tuist {#migrating-from-swift-package-manager-to-tuist}

Section titled “从 Swift Package Manager 迁移到 Tuist {#migrating-from-swift-package-manager-to-tuist}”

Swift Package Manager 和 Tuist 之间的相似性使迁移过程变得简单明了。主要区别在于你将使用 Tuist 的 DSL 而不是 Package.swift 来定义项目。

首先,在 Package.swift 文件旁边创建一个 Project.swift 文件。Project.swift 文件将包含项目的定义。以下是一个定义单个目标的 Project.swift 文件示例:

import ProjectDescription
let project = Project(
name: "App",
targets: [
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "dev.tuist.App",
sources: ["Sources/**/*.swift"]*
),
]
)

需要注意的事项:

  • ProjectDescription:你将使用 ProjectDescription 而不是 PackageDescription
  • Project:你将导出 project 实例而不是 package 实例。
  • Xcode 语言:用于定义项目的原语模仿 Xcode 的语言,因此你会发现方案、目标和构建阶段等。

然后创建包含以下内容的 Tuist.swift 文件:

import ProjectDescription
let tuist = Tuist()

Tuist.swift 包含项目的配置,其路径用作确定项目根目录的参考。你可以查看 目录结构 文档以详细了解 Tuist 项目的结构。

你可以使用 tuist edit 在 Xcode 中编辑项目。该命令将生成一个 Xcode 项目,你可以打开它并开始工作。

Terminal window
tuist edit

根据项目的大小,你可以考虑一次性完成或增量完成。我们建议从一个小项目开始,以熟悉 DSL 和工作流程。我们的建议始终是从依赖最多的目标开始,一直迁移到顶层目标。