# Манифесты {#manifests}

По умолчанию Tuist использует файлы Swift как основной способ определения проектов и рабочих областей, а также настройки процесса генерации. В документации такие файлы называются **манифестами**.

Решение использовать Swift было вдохновлено [Swift Package Manager](https://www.swift.org/documentation/package-manager/), который также применяет файлы Swift для определения пакетов. Благодаря использованию Swift мы можем задействовать компилятор для проверки корректности содержимого и повторного использования кода в разных манифестах, а также использовать Xcode для обеспечения первоклассного опыта редактирования благодаря подсветке синтаксиса, автодополнению и проверке.

> [!NOTE]
> **Кэширование**
>
> Поскольку манифесты — это файлы Swift, которые необходимо компилировать, Tuist кэширует результаты компиляции, чтобы ускорить процесс парсинга. Поэтому вы можете заметить, что при первом запуске Tuist генерация проекта займет немного больше времени. Последующие запуски будут быстрее.


## Project.swift {#projectswift}

Манифест [`Project.swift`](https://projectdescription.tuist.dev/documentation/projectdescription/project) объявляет проект Xcode. Проект генерируется в той же директории, где находится файл манифеста, с именем, указанным в свойстве `name`.

```swift
// Project.swift
let project = Project(
    name: "App",
    targets: [
        // ....
    ]
)
```


> [!WARNING]
> **Корневые переменные**
>
> Единственная переменная, которая должна находиться в корне манифеста, — это `let project = Project(...)`. Если вам нужно повторно использовать код в разных частях манифеста, вы можете использовать функции Swift.


## Workspace.swift {#workspaceswift}

По умолчанию Tuist генерирует [Xcode Workspace](https://developer.apple.com/documentation/xcode/projects-and-workspaces), содержащую генерируемый проект и проекты его зависимостей. Если по какой-либо причине вы хотите настроить рабочую область, добавив дополнительные проекты или включив файлы и группы, вы можете сделать это, определив манифест [`Workspace.swift`](https://projectdescription.tuist.dev/documentation/projectdescription/workspace).

```swift
// Workspace.swift
import ProjectDescription

let workspace = Workspace(
    name: "App-Workspace",
    projects: [
        "./App", // Path to directory containing the Project.swift file
    ]
)
```

> [!NOTE]
> Tuist разрешит граф зависимостей и включит проекты зависимостей в рабочую область. Вам не нужно добавлять их вручную. Это необходимо для того, чтобы система сборки могла корректно разрешить зависимости.


### Мультипроект или монопроект {#multi-or-monoproject}

Часто возникает вопрос: использовать один проект или несколько проектов в рабочей области. В мире без Tuist, где настройка монопроекта приводила бы к частым конфликтам в Git, рекомендуется использовать рабочие области. Однако, поскольку мы не рекомендуем включать сгенерированные Tuist проекты Xcode в репозиторий Git, конфликты Git не являются проблемой. Поэтому решение об использовании одного проекта или нескольких проектов в рабочей области остается за вами.

В проекте Tuist мы предпочитаем монопроекты, потому что время холодной генерации меньше (требуется компилировать меньше файлов манифестов), и мы используем <.localized_link href="/guides/features/projects/code-sharing">помощники описания проекта</.localized_link> как единицу инкапсуляции. Однако вы можете использовать проекты Xcode как единицу инкапсуляции для представления различных доменов вашего приложения, что больше соответствует рекомендуемой структуре проектов в Xcode.

## Tuist.swift {#tuistswift}

Tuist предоставляет <.localized_link href="/contributors/principles#default-to-conventions">разумные значения по умолчанию</.localized_link>, чтобы упростить конфигурацию проекта. Однако вы можете настроить конфигурацию, определив [`Tuist.swift`](https://projectdescription.tuist.dev/documentation/projectdescription/tuist) в корне проекта, который Tuist использует для определения корня проекта.

```swift
import ProjectDescription

let tuist = Tuist(
    project: .tuist(generationOptions: .options(enforceExplicitDependencies: true))
)
```
