Версионирование, разрешение конфликтов и плагины Swift
Управляйте диапазонами версий, разрешайте конфликты зависимостей и используйте плагины инструментов сборки.
«Версионирование, разрешение конфликтов и плагины Swift» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Семантическое версионирование в SPM
SPM использует семантическое версионирование: MAJOR.MINOR.PATCH. Указывайте требования с помощью from:, exact: или .upToNextMajor.
.package(url: "https://github.com/apple/swift-log", from: "1.5.0"),
.package(url: "https://github.com/vapor/vapor", exact: "4.83.0"),
.package(url: "https://github.com/pointfreeco/swift-composable-architecture",
.upToNextMajor(from: "1.0.0"))Package.resolved
Package.resolved фиксирует точные версии всех зависимостей. Добавляйте этот файл в репозиторий приложений, но не библиотек.
// Package.resolved (auto-generated):
// Pins exact commit hash and version for every dependency
// Run "swift package update" to update pinned versionsРазрешение конфликтов версий
Если два пакета требуют разные версии одной зависимости, SPM пытается найти совместимую версию. Конфликты, которые невозможно разрешить, приводят к ошибке сборки.
// PackageA requires Logging 1.4.0
// PackageB requires Logging 1.5.0
// SPM resolves to 1.5.0 (satisfies both >= 1.x)
// Conflict: PackageA requires Logging 1.x, PackageB requires 2.xПринудительный выбор версии
Добавьте конфликтующую зависимость непосредственно в Package.swift приложения, чтобы переопределить версию, которую иначе выбрал бы SPM.
// Force Logging 1.5.0 by declaring it directly:
.package(url: "https://github.com/apple/swift-log", exact: "1.5.0")Плагины инструментов сборки
Плагины инструментов сборки запускаются во время сборки, чтобы автоматически генерировать исходный код, обрабатывать ресурсы или запускать средства проверки.
// In Package.swift:
.plugin(
name: "SourceGenerator",
capability: .buildTool()
)Реализация плагина инструмента сборки
Плагин инструмента сборки соответствует протоколу BuildToolPlugin и возвращает команды BuildCommand или команды предварительной сборки PrebuildCommand.
import PackagePlugin
@main
struct SourceGenerator: BuildToolPlugin {
func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
let output = context.pluginWorkDirectory.appending("Generated.swift")
return [.buildCommand(
displayName: "Generating sources",
executable: try context.tool(named: "gen-tool").path,
arguments: ["--output", output],
outputFiles: [output]
)]
}
}Плагины команд
Плагины команд запускаются по требованию из Xcode или CLI и подходят для форматирования, проверки кода или генерации документации.
// In Package.swift:
.plugin(
name: "FormatPlugin",
capability: .command(intent: .sourceCodeFormatting())
)Запуск плагина команд
Запускайте плагины команд из терминала или через контекстное меню Xcode, вызываемое щелчком правой кнопки мыши.
// CLI:
swift package plugin format-source-code
// Xcode: right-click target → "Format Source Code"Использование SwiftLint как плагина сборки
SwiftLint поставляется как плагин SPM и автоматически запускается при каждой сборке.
.package(url: "https://github.com/realm/SwiftLint", from: "0.54.0"),
// In target:
.plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLint")Песочница плагинов
Для безопасности плагины запускаются в песочнице с ограниченным доступом к файловой системе. Они могут записывать данные только в назначенный им рабочий каталог.
// Accessible from plugins:
// context.pluginWorkDirectory — writable work dir
// context.package.directory — read-only source
// target.sourceFiles — source file listБыстрая проверка
Для чего нужен Package.resolved в пакете Swift?
Итоги урока
Используйте диапазоны семантических версий в Package.swift. Добавляйте Package.resolved в репозитории приложений, чтобы сборки можно было воспроизводить. Разрешайте конфликты версий, объявляя зависимость непосредственно в проекте. Плагины инструментов сборки автоматически запускаются во время сборки (средства проверки и генераторы кода). Плагины команд запускаются по требованию. Плагины работают в песочнице для обеспечения безопасности.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Версионирование, разрешение конфликтов и плагины Swift» бесплатный?
Да — полный текст урока «Версионирование, разрешение конфликтов и плагины Swift» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Версионирование, разрешение конфликтов и плагины Swift»?
Управляйте диапазонами версий, разрешайте конфликты зависимостей и используйте плагины инструментов сборки. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Версионирование, разрешение конфликтов и плагины Swift»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Package.swift: цели, продукты и зависимости
- Локальные пакеты и модули функций
- Двоичные цели и XCFrameworks
- Версионирование, разрешение конфликтов и плагины Swift