跳转到内容

迁移 Bazel 项目

迁移 Bazel 项目 {#migrate-a-bazel-project}

Section titled “迁移 Bazel 项目 {#migrate-a-bazel-project}”

Bazel 是 Google 于 2015 年开源的构建系统。它是一个强大的工具,可以让你快速可靠地构建和测试任意规模的软件。一些大型组织如 SpotifyTinderLyft 都在使用它,然而,引入和维护它需要前期投入(即学习技术)和持续投入(即跟上 Xcode 更新)。虽然这对于一些将其作为跨领域问题来处理的组织来说是可以的,但对于想要专注于产品开发的组织来说可能不是最佳选择。例如,我们见过一些组织,其 iOS 平台团队引入了 Bazel,但在负责这项工作的工程师离开公司后不得不放弃它。苹果对 Xcode 和构建系统之间紧密耦合的态度是另一个使得 Bazel 项目难以长期维护的因素。

::: tip TUIST 的独特之处在于其精致

Tuist 不是与 Xcode 和 Xcode 项目对抗,而是拥抱它。它使用相同的概念(例如 targets、scheme、构建设置)、熟悉的语言(即 Swift),以及简单愉快的体验,使维护和扩展项目成为每个人的工作,而不仅仅是 iOS 平台团队的工作。

:::

Bazel 使用规则来定义如何构建和测试软件。这些规则用 Starlark 编写,这是一种类似 Python 的语言。Tuist 使用 Swift 作为配置语言,为开发者提供了使用 Xcode 自动补全、类型检查和验证功能的便利。例如,以下规则描述了如何在 Bazel 中构建 Swift 库:

::: code-group

swift_library(
name = "MyLibrary.library",
srcs = glob(["**/*.swift"]),
module_name = "MyLibrary"
)
let project = Project(
// ...
targets: [
.target(name: "MyLibrary", product: .staticLibrary, sources: ["**/*.swift"])
]
)

:::

下面是另一个例子,比较了在 Bazel 和 Tuist 中如何定义单元测试:

::: code-group

ios_unit_test(
name = "MyLibraryTests",
bundle_id = "dev.tuist.MyLibraryTests",
minimum_os_version = "16.0",
test_host = "//MyApp:MyLibrary",
deps = [":MyLibraryTests.library"],
)
let project = Project(
// ...
targets: [
.target(
name: "MyLibraryTests",
destinations: .iOS,
product: .unitTests,
bundleId: "dev.tuist.MyLibraryTests",
sources: "Tests/MyLibraryTests/**",
dependencies: [
.target(name: "MyLibrary"),
]
)
]
)

:::

Swift Package Manager 依赖 {#swift-package-manager-dependencies}

Section titled “Swift Package Manager 依赖 {#swift-package-manager-dependencies}”

在 Bazel 中,你可以使用 rules_swift_package_manager Gazelle 插件来将 Swift 包作为依赖使用。该插件需要一个 Package.swift 作为依赖的 truth source。Tuist 的接口与 Bazel 类似。你可以使用 tuist install 命令来解析和拉取包的依赖。解析完成后,可以使用 tuist generate 命令生成项目。

Terminal window
tuist install # 获取定义在 Tuist/Package.swift 中的依赖
tuist generate # 生成 Xcode 项目

社区提供了一组规则 rules_xcodeproj,用于从 Bazel 声明的项目生成 Xcode 项目。与 Bazel 不同的是,Bazel 需要在 BUILD 文件中添加一些配置,而 Tuist 完全不需要任何配置。你可以在项目根目录运行 tuist generate,Tuist 会为你生成一个 Xcode 项目。