Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift
Zarządzanie zakresami wersji, rozwiązywanie konfliktów zależności i używanie wtyczek narzędzi kompilacji.
Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Wersjonowanie semantyczne w SPM
SPM używa semver: MAJOR.MINOR.PATCH. Wymagania należy deklarować za pomocą from:, exact: lub .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 przypina dokładne wersje wszystkich zależności. W przypadku aplikacji należy go zatwierdzić w systemie kontroli wersji, a w przypadku bibliotek pominąć.
// Package.resolved (auto-generated):
// Pins exact commit hash and version for every dependency
// Run "swift package update" to update pinned versionsRozwiązywanie konfliktów wersji
Gdy dwa pakiety wymagają różnych wersji tej samej zależności, SPM próbuje znaleźć zgodną wersję. Konflikty, których nie można rozwiązać, powodują błąd kompilacji.
// 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.xWymuszanie wersji
Należy dodać konfliktową zależność bezpośrednio do pliku Package.swift aplikacji, aby zastąpić wersję, którą w przeciwnym razie wybrałby SPM.
// Force Logging 1.5.0 by declaring it directly:
.package(url: "https://github.com/apple/swift-log", exact: "1.5.0")Wtyczki narzędzi budowania
Wtyczki narzędzi budowania uruchamiają się podczas kompilacji, aby automatycznie generować kod źródłowy, przetwarzać zasoby lub uruchamiać lintery.
// In Package.swift:
.plugin(
name: "SourceGenerator",
capability: .buildTool()
)Implementowanie wtyczki narzędzia budowania
Wtyczka narzędzia budowania musi implementować protokół BuildToolPlugin i zwracać polecenia BuildCommand lub 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]
)]
}
}Wtyczki poleceń
Wtyczki poleceń uruchamiają się na żądanie z Xcode lub interfejsu wiersza poleceń. Są przydatne do formatowania, lintowania lub generowania dokumentacji.
// In Package.swift:
.plugin(
name: "FormatPlugin",
capability: .command(intent: .sourceCodeFormatting())
)Uruchamianie wtyczki polecenia
Wtyczki poleceń można uruchamiać w terminalu lub z menu kontekstowego Xcode.
// CLI:
swift package plugin format-source-code
// Xcode: right-click target → "Format Source Code"Używanie SwiftLint jako wtyczki narzędzia budowania
SwiftLint jest dostarczany jako wtyczka SPM, która uruchamia się automatycznie podczas każdej kompilacji.
.package(url: "https://github.com/realm/SwiftLint", from: "0.54.0"),
// In target:
.plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLint")Piaskownica wtyczki
Ze względów bezpieczeństwa wtyczki działają w piaskownicy z ograniczonym dostępem do systemu plików. Mogą zapisywać pliki wyłącznie w wyznaczonym katalogu roboczym.
// Accessible from plugins:
// context.pluginWorkDirectory — writable work dir
// context.package.directory — read-only source
// target.sourceFiles — source file listSzybkie sprawdzenie
Jaki jest cel pliku Package.resolved w pakiecie Swift?
Podsumowanie lekcji
Należy używać zakresów semver w Package.swift. W przypadku aplikacji należy zatwierdzać plik Package.resolved, aby zapewnić powtarzalność kompilacji. Konflikty wersji można rozwiązywać, deklarując zależność bezpośrednio. Wtyczki narzędzi budowania uruchamiają się automatycznie podczas kompilacji (lintery, generatory kodu). Wtyczki poleceń uruchamiają się na żądanie. Ze względów bezpieczeństwa wtyczki działają w piaskownicy.
Często zadawane pytania
Czy lekcja „Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift” jest bezpłatna?
Tak — pełny tekst „Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift”?
Zarządzanie zakresami wersji, rozwiązywanie konfliktów zależności i używanie wtyczek narzędzi kompilacji. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Package.swift: cele, produkty i zależności
- Pakiety lokalne i moduły funkcji
- Cele binarne i XCFrameworks
- Wersjonowanie, rozwiązywanie konfliktów i wtyczki Swift