# Миграция пакета Swift {#migrate-a-swift-package}

Swift Package Manager появился как менеджер зависимостей для кода на Swift, который непреднамеренно стал решать задачу управления проектами и поддержки других языков программирования, таких как Objective-C. Поскольку инструмент разрабатывался с другой целью, его использование для управления крупными проектами может быть затруднительным: ему не хватает гибкости, производительности и возможностей, которые предоставляет Tuist. Это хорошо описано в статье [Scaling iOS at Bumble](https://medium.com/bumble-tech/scaling-ios-at-bumble-239e0fa009f2), где приведена следующая таблица сравнения производительности Swift Package Manager и нативных проектов Xcode:

<img style="max-width: 400px;" alt="Таблица, сравнивающая снижение производительности при использовании SPM вместо нативных проектов Xcode" src="/images/guides/start/migrate/performance-table.webp">

Мы часто сталкиваемся с разработчиками и организациями, которые сомневаются в необходимости Tuist, полагая, что Swift Package Manager может выполнять схожую роль в управлении проектами. Некоторые решаются на миграцию, но позже обнаруживают, что их опыт разработки значительно ухудшился. Например, переименование файла может потребовать до 15 секунд на повторную индексацию. 15 секунд!

**Неясно, сделает ли Apple Swift Package Manager полноценным менеджером проектов, готовым к масштабированию.** Однако мы не видим никаких признаков того, что это происходит. На самом деле наблюдается обратное. Apple принимает решения, вдохновленные подходом Xcode, например, обеспечивает удобство за счет неявных конфигураций, что, <.localized_link href="/guides/features/projects/cost-of-convenience">как вы знаете,</.localized_link> становится источником сложностей при масштабировании. Мы считаем, что Apple нужно вернуться к базовым принципам и пересмотреть некоторые решения, которые имели смысл для менеджера зависимостей, но не для менеджера проектов, например, использование компилируемого языка в качестве интерфейса для определения проектов.

> [!TIP]
> **SPM только как менеджер зависимостей**
>
> Tuist рассматривает Swift Package Manager как менеджер зависимостей, и он отлично справляется с этой задачей. Мы используем его для разрешения зависимостей и их сборки. Мы не используем его для определения проектов, потому что он не предназначен для этого.


## Миграция со Swift Package Manager на Tuist {#migrating-from-swift-package-manager-to-tuist}

Сходства между Swift Package Manager и Tuist делают процесс миграции простым. Основное отличие заключается в том, что вы будете определять проекты с помощью DSL Tuist вместо `Package.swift`.

Сначала создайте файл `Project.swift` рядом с вашим файлом `Package.swift`. Файл `Project.swift` будет содержать определение вашего проекта. Вот пример файла `Project.swift`, который определяет проект с одной целью:

```swift
import ProjectDescription

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

Несколько моментов, на которые стоит обратить внимание:

- **ProjectDescription**: вместо использования `PackageDescription` вы будете использовать `ProjectDescription`.
- **Project:** вместо экспорта экземпляра `package` вы будете экспортировать экземпляр `project`.
- **Язык Xcode:** примитивы, которые вы используете для определения проекта, имитируют язык Xcode, поэтому среди прочего вы найдете схемы, цели и фазы сборки.

Затем создайте файл `Tuist.swift` со следующим содержимым:

```swift
import ProjectDescription

let tuist = Tuist()
```

Файл `Tuist.swift` содержит конфигурацию вашего проекта, а его путь служит ориентиром для определения корня проекта. Подробнее о структуре проектов Tuist можно узнать в документе о <.localized_link href="/guides/features/projects/directory-structure">структуре каталогов</.localized_link>.

## Редактирование проекта {#editing-the-project}

Вы можете использовать <.localized_link href="/guides/features/projects/editing">`tuist edit`</.localized_link> для редактирования проекта в Xcode. Команда сгенерирует проект Xcode, который можно открыть и начать работу.

```bash
tuist edit
```

В зависимости от размера проекта вы можете применить изменения сразу или поэтапно. Мы рекомендуем начать с небольшого проекта, чтобы освоить DSL и рабочий процесс. Наш совет — всегда начинать с цели, от которой зависят другие, и двигаться вплоть до целевой цели верхнего уровня.
