Swift Academy · Урок

Версионирование, разрешение конфликтов и плагины Swift

Управляйте диапазонами версий, разрешайте конфликты зависимостей и используйте плагины инструментов сборки.

Урок 4 из 412 шагов

«Версионирование, разрешение конфликтов и плагины 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 — локальная установка не требуется.

Все уроки этого курса

  1. Package.swift: цели, продукты и зависимости
  2. Локальные пакеты и модули функций
  3. Двоичные цели и XCFrameworks
  4. Версионирование, разрешение конфликтов и плагины Swift
← Назад к Swift Academy