# Динамическая конфигурация {#dynamic-configuration}

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

## Конфигурация через переменные окружения {#configuration-through-environment-variables}

Tuist позволяет передавать конфигурацию через переменные окружения, доступные из файлов манифеста. Например:

```bash
TUIST_APP_NAME=MyApp tuist generate
```

Чтобы передать несколько переменных окружения, просто разделите их пробелом. Например:

```bash
TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate
```

## Чтение переменных окружения из манифестов {#reading-the-environment-variables-from-manifests}

Переменные можно получать через тип [`Environment`](https://projectdescription.tuist.dev/documentation/projectdescription/environment). Любые переменные, соответствующие соглашению `TUIST_XXX` и определённые в окружении или переданные Tuist при выполнении команд, будут доступны через тип `Environment`. В следующем примере показано, как получить переменную `TUIST_APP_NAME`:

```swift
func appName() -> String {
    if case let .string(environmentAppName) = Environment.appName {
        return environmentAppName
    } else {
        return "MyApp"
    }
}
```

Получение переменных возвращает экземпляр типа `Environment.Value?`, который может принимать одно из следующих значений:

| Вариант | Описание |
| --- | --- |
| `.string(String)` | Используется, когда переменная представляет строку. |

Также можно получить строковую или булеву переменную `Environment` с помощью вспомогательных методов, описанных ниже. Эти методы требуют указания значения по умолчанию, чтобы гарантировать согласованные результаты при каждом вызове. Это избавляет от необходимости определять функцию appName(), показанную выше.

::: code-group

```swift [String]
Environment.appName.getString(default: "TuistServer")
```

```swift [Boolean]
Environment.isCI.getBoolean(default: false)
```
<!-- -->
:::

## Передача дополнительных переменных окружения в манифесты {#forwarding-additional-environment-variables-to-manifests}

По умолчанию в подпроцесс, который вычисляет `Project.swift`, `Workspace.swift`, `Package.swift` и хелперы описания проекта, передаются только переменные с префиксом `TUIST_`, а также `CI` и `DEVELOPER_DIR`. Это делает генерацию детерминированной и предотвращает инвалидацию кэша манифеста из-за нерелевантных переменных оболочки или CI.

Если манифесту нужно читать переменные, которые вы не контролируете (например, сторонний `Package.swift`, который уже читает `OPENSWIFTUI_LIBRARY_TYPE`), объявите их в `Tuist.swift` через `manifestEnvironment` в опциях генерации. Каждая запись — это либо точное имя переменной, либо имя, заканчивающееся на `*`, для сопоставления по префиксу:

```swift
import ProjectDescription

let tuist = Tuist(
    project: .tuist(
        generationOptions: .options(
            manifestEnvironment: [
                "OPENSWIFTUI_*",
                "MY_VAR",
            ]
        )
    )
)
```

Перечисленные переменные участвуют в хэше кэша манифеста, поэтому изменения их значений корректно инвалидируют кэш. Переменные, не включённые в список, остаются недоступными при оценке манифеста.
