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

Динамическая конфигурация

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

Конфигурация через переменные окружения#

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

bash
TUIST_APP_NAME=MyApp tuist generate

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

bash
TUIST_APP_NAME=MyApp TUIST_APP_LOCALE=pl tuist generate

Чтение переменных окружения из манифестов#

Переменные можно получать через тип 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(), показанную выше.

swift
Environment.appName.getString(default: "TuistServer")
swift
Environment.isCI.getBoolean(default: false)

Передача дополнительных переменных окружения в манифесты#

По умолчанию в подпроцесс, который вычисляет 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",
]
)
)
)

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