Метки метаданных
По мере роста размера и сложности проектов работа со всей кодовой базой сразу может стать неэффективной. Tuist предоставляет метки метаданных как способ организации таргетов в логические группы и фокусировки на конкретных частях вашего проекта во время разработки.
Что такое метки метаданных?#
Метки метаданных — это строковые ярлыки, которые можно прикреплять к таргетам в вашем проекте. Они служат маркерами, позволяющими:
- Группировать связанные таргеты — помечайте таргеты, относящиеся к одной функции, команде или архитектурному слою
- Фокусировать рабочее пространство — генерируйте проекты, включающие только таргеты с определёнными метками
- Оптимизировать рабочий процесс — работайте над конкретными функциями без загрузки несвязанных частей кодовой базы
- Выбирать таргеты для хранения в виде исходного кода — выбирайте, какую группу таргетов вы хотите хранить в виде исходного кода при кэшировании
Метки определяются с помощью свойства metadata у таргетов и хранятся в виде массива строк.
Определение меток метаданных#
Вы можете добавить метки к любому таргету в манифесте вашего проекта:
import ProjectDescription
let project = Project(
name: "MyApp",
targets: [
.target(
name: "Authentication",
destinations: .iOS,
product: .framework,
bundleId: "com.example.authentication",
sources: ["Sources/**"],
metadata: .metadata(tags: ["feature:auth", "team:identity"])
),
.target(
name: "Payment",
destinations: .iOS,
product: .framework,
bundleId: "com.example.payment",
sources: ["Sources/**"],
metadata: .metadata(tags: ["feature:payment", "team:commerce"])
),
.target(
name: "App",
destinations: .iOS,
product: .app,
bundleId: "com.example.app",
sources: ["Sources/**"],
dependencies: [
.target(name: "Authentication"),
.target(name: "Payment")
]
)
]
)
Фокусировка на помеченных таргетах#
После того как вы пометили свои таргеты, вы можете использовать команду tuist generate, чтобы создать сфокусированный проект, включающий только определённые таргеты:
Фокусировка по метке#
Используйте префикс tag:, чтобы сгенерировать проект со всеми таргетами, соответствующими определённой метке:
# Generate project with all authentication-related targets
tuist generate tag:feature:auth
# Generate project with all targets owned by the identity team
tuist generate tag:team:identity
Фокусировка по имени#
Вы также можете сфокусироваться на конкретных таргетах по имени:
# Generate project with the Authentication target
tuist generate Authentication
Как работает фокусировка#
При фокусировке на таргетах:
- Включённые таргеты — таргеты, соответствующие вашему запросу, включаются в сгенерированный проект
- Зависимости — все зависимости сфокусированных таргетов автоматически включаются
- Тестовые таргеты — тестовые таргеты для сфокусированных таргетов включаются
- Исключение — все остальные таргеты исключаются из рабочего пространства
Это означает, что вы получаете меньшее, более управляемое рабочее пространство, содержащее только то, что нужно для работы над вашей функцией.
Соглашения об именах меток#
Хотя вы можете использовать любую строку в качестве метки, следование единому соглашению об именах помогает поддерживать порядок в ваших метках:
// Organize by feature
metadata: .metadata(tags: ["feature:authentication", "feature:payment"])
// Organize by team ownership
metadata: .metadata(tags: ["team:identity", "team:commerce"])
// Organize by architectural layer
metadata: .metadata(tags: ["layer:ui", "layer:business", "layer:data"])
// Organize by platform
metadata: .metadata(tags: ["platform:ios", "platform:macos"])
// Combine multiple dimensions
metadata: .metadata(tags: ["feature:auth", "team:identity", "layer:ui"])
Использование префиксов, таких как feature:, team: или layer:, упрощает понимание назначения каждой метки и избегание конфликтов имён.
Системные метки#
Tuist использует префикс tuist: для системных меток. Эти метки автоматически применяются Tuist и могут использоваться в профилях кэша для выбора определённых типов сгенерированного контента.
Доступные системные метки#
| Метка | Описание |
|---|---|
tuist:synthesized | Применяется к синтезированным таргетам пакетов, которые Tuist создаёт для обработки ресурсов в статических библиотеках и статических фреймворках. Эти пакеты существуют по историческим причинам для предоставления API доступа к ресурсам. |
Использование системных меток с профилями кэша#
Вы можете использовать системные метки в профилях кэша, чтобы включать или исключать синтезированные таргеты:
import ProjectDescription
let tuist = Tuist(
project: .tuist(
cacheOptions: .options(
profiles: .profiles(
[
"development": .profile(
.onlyExternal,
and: ["tag:tuist:synthesized"] // Also cache synthesized bundles
)
],
default: .onlyExternal
)
)
)
)
Синтезированные таргеты пакетов наследуют все метки от своего родительского таргета в дополнение к получению метки tuist:synthesized. Это означает, что если вы пометите статическую библиотеку меткой feature:auth, её синтезированный пакет ресурсов будет иметь обе метки: feature:auth и tuist:synthesized.
Использование меток с хелперами описания проекта#
Вы можете использовать хелперы описания проекта, чтобы стандартизировать применение меток в вашем проекте:
// Tuist/ProjectDescriptionHelpers/Project+Templates.swift
import ProjectDescription
extension Target {
public static func feature(
name: String,
team: String,
dependencies: [TargetDependency] = []
) -> Target {
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "com.example.\(name.lowercased())",
sources: ["Sources/**"],
dependencies: dependencies,
metadata: .metadata(tags: [
"feature:\(name.lowercased())",
"team:\(team.lowercased())"
])
)
}
}
Затем используйте их в ваших манифестах:
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project(
name: "Features",
targets: [
.feature(name: "Authentication", team: "Identity"),
.feature(name: "Payment", team: "Commerce"),
]
)
Преимущества использования метаданных-меток#
Улучшенный опыт разработки#
Фокусируясь на конкретных частях вашего проекта, вы можете:
- Уменьшить размер проекта Xcode — работать с меньшими проектами, которые быстрее открываются и проще в навигации
- Ускорить сборки — собирать только то, что нужно для текущей работы
- Повысить концентрацию — избегать отвлечения на несвязанный код
- Оптимизировать индексацию — Xcode индексирует меньше кода, что ускоряет автодополнение
Лучшая организация проекта#
Метки предоставляют гибкий способ организации вашей кодовой базы:
- Несколько измерений — помечайте таргеты по функции, команде, слою, платформе или любому другому измерению
- Без структурных изменений — добавляйте организационную структуру без изменения расположения директорий
- Сквозные задачи — один таргет может принадлежать нескольким логическим группам
Интеграция с кэшированием#
Метаданные-метки бесшовно работают с возможностями кэширования Tuist:
# Cache all targets
tuist cache
# Focus on targets with a specific tag and use cached dependencies
tuist generate tag:feature:payment
Рекомендации#
- Начните с простого — начните с одного измерения тегирования (например, функции) и расширяйте по мере необходимости
- Будьте последовательны — используйте одни и те же соглашения об именах во всех ваших манифестах
- Документируйте ваши метки — ведите список доступных меток и их значений в документации вашего проекта
- Используйте хелперы — применяйте хелперы описания проекта для стандартизации применения меток
- Периодически пересматривайте — по мере развития проекта пересматривайте и обновляйте вашу стратегию тегирования
Связанные возможности#
- Общий код — используйте хелперы описания проекта для стандартизации использования меток
- Кэш — комбинируйте метки с кэшированием для оптимальной производительности сборки
- Выборочное тестирование — запускайте тесты только для изменённых таргетов