Динамическая конфигурация
В некоторых сценариях может потребоваться динамически настраивать проект во время генерации. Например, вы можете захотеть изменить имя приложения, идентификатор пакета или целевую версию развёртывания в зависимости от окружения, в котором генерируется проект. Tuist поддерживает это через переменные окружения, которые можно читать из файлов манифеста.
Конфигурация через переменные окружения#
Tuist позволяет передавать конфигурацию через переменные окружения, доступные из файлов манифеста. Например:
TUIST_APP_NAME=MyApp tuist generate
Чтобы передать несколько переменных окружения, просто разделите их пробелом. Например:
TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate
Чтение переменных окружения из манифестов#
Переменные можно получать через тип Environment. Любые переменные, соответствующие соглашению TUIST_XXX и определённые в окружении или переданные Tuist при выполнении команд, будут доступны через тип Environment. В следующем примере показано, как получить переменную TUIST_APP_NAME:
func appName() -> String {
if case let .string(environmentAppName) = Environment.appName {
return environmentAppName
} else {
return "MyApp"
}
}
Получение переменных возвращает экземпляр типа Environment.Value?, который может принимать одно из следующих значений:
| Вариант | Описание |
|---|---|
.string(String) | Используется, когда переменная представляет строку. |
Также можно получить строковую или булеву переменную Environment с помощью вспомогательных методов, описанных ниже. Эти методы требуют указания значения по умолчанию, чтобы гарантировать согласованные результаты при каждом вызове. Это избавляет от необходимости определять функцию appName(), показанную выше.
Environment.appName.getString(default: "TuistServer")
Environment.isCI.getBoolean(default: false)
Передача дополнительных переменных окружения в манифесты#
По умолчанию в подпроцесс, который вычисляет Project.swift, Workspace.swift, Package.swift и хелперы описания проекта, передаются только переменные с префиксом TUIST_, а также CI и DEVELOPER_DIR. Это делает генерацию детерминированной и предотвращает инвалидацию кэша манифеста из-за нерелевантных переменных оболочки или CI.
Если манифесту нужно читать переменные, которые вы не контролируете (например, сторонний Package.swift, который уже читает OPENSWIFTUI_LIBRARY_TYPE), объявите их в Tuist.swift через manifestEnvironment в опциях генерации. Каждая запись — это либо точное имя переменной, либо имя, заканчивающееся на *, для сопоставления по префиксу:
import ProjectDescription
let tuist = Tuist(
project: .tuist(
generationOptions: .options(
manifestEnvironment: [
"OPENSWIFTUI_*",
"MY_VAR",
]
)
)
)
Перечисленные переменные участвуют в хэше кэша манифеста, поэтому изменения их значений корректно инвалидируют кэш. Переменные, не включённые в список, остаются недоступными при оценке манифеста.