Перейти к содержимому

Миграция проекта с Bazel

Bazel — это система сборки, которую Google открыла в 2015 году. Это мощный инструмент, позволяющий быстро и надежно собирать и тестировать программное обеспечение любого масштаба. Его используют крупные компании, такие как Spotify, Tinder и Lyft. Однако внедрение и поддержка требуют первоначальных (изучение технологии) и постоянных (поддержка обновлений Xcode) инвестиций. Хотя для некоторых организаций, рассматривающих это как сквозную задачу, такой подход работает, он может не подойти тем, кто хочет сосредоточиться на разработке продукта. Например, мы видели случаи, когда команды iOS-платформ внедряли Bazel, но были вынуждены отказаться от него после ухода инженеров, возглавлявших эту инициативу. Еще одним фактором, усложняющим долгосрочную поддержку проектов на Bazel, является позиция Apple относительно тесной связи между Xcode и системой сборки.

Уникальность Tuist — в изяществе подхода

Вместо борьбы с Xcode и проектами Xcode Tuist принимает их как данность. Те же концепции (например, цели, схемы, настройки сборки), знакомый язык (Swift) и простой, приятный опыт работы делают поддержку и масштабирование проектов задачей всей команды, а не только платформы iOS.

Правила#

Bazel использует правила для определения процессов сборки и тестирования программного обеспечения. Правила пишутся на языке Starlark, похожем на Python. В Tuist в качестве языка конфигурации используется Swift, что дает разработчикам возможность пользоваться автодополнением, проверкой типов и валидацией в Xcode. Например, следующее правило описывает сборку библиотеки Swift в Bazel:

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

Вот еще один пример, сравнивающий определение модульных тестов в Bazel и Tuist:

plaintext
ios_unit_test(
name = "MyLibraryTests",
bundle_id = "dev.tuist.MyLibraryTests",
minimum_os_version = "16.0",
test_host = "//MyApp:MyLibrary",
deps = [":MyLibraryTests.library"],
)
swift
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#

В Bazel можно использовать плагин Gazelle из набора rules_swift_package_manager, чтобы подключать Swift-пакеты как зависимости. Плагин требует наличия файла Package.swift как источника истины для зависимостей. Интерфейс Tuist в этом плане схож с Bazel. Вы можете использовать команду tuist install для разрешения и загрузки зависимостей пакета. После завершения разрешения зависимостей сгенерируйте проект командой tuist generate.

bash
tuist install # Fetch dependencies defined in Tuist/Package.swift
tuist generate # Generate an Xcode project

Генерация проекта#

Сообщество предоставляет набор правил rules_xcodeproj для генерации проектов Xcode на основе проектов, объявленных в Bazel. В отличие от Bazel, где нужно добавлять конфигурацию в файл BUILD, Tuist не требует никакой дополнительной настройки. Достаточно выполнить tuist generate в корневом каталоге проекта, и Tuist сгенерирует для вас проект Xcode.