SPM: bu nima, Swift Package Manager va Package.swift

Muallif: IT Sectr Nashr etilgan: 2026-02-13 O'qish vaqti: 11 daq

SPM (Swift Package Manager) — Apple tomonidan uchinchi tomon kutubxonalarini ulash, qurish va yangilashni avtomatlashtirish uchun ishlab chiqilgan Swift ekotizimining o'rnatilgan paket menejeri. SPM Swift 3.0 (2016 yil) versiyasidan boshlab Swift kompilyatorining tarkibiga kiradi va alohida o'rnatishni talab qilmaydi. CocoaPods va Carthage-dan farqli o'laroq, SPM to'g'ridan-to'g'ri kompilyator va Xcode bilan integratsiyalangan, bu uni zamonaviy Swift loyihalarida bog'liqliklarni boshqarishning standart vositasiga aylantiradi. Maqolada Package.swift tuzilishi, SPM buyruqlari, o'z paketlarini yozish va muqobil menejerlardan migratsiyani ko'rib chiqamiz.

Asosiy ma'lumotlar

  • SPM (Swift Package Manager) — Swift kompilyatoriga o'rnatilgan, alohida o'rnatishni talab qilmaydigan paket menejeri; iOS, macOS, Linux va server platformalarida ishlaydi.
  • Package.swift — paket nomi, platformalar, bog'liqliklar va maqsadli modullarni (targets) deklarativ formatda tavsiflovchi manifest fayli.
  • SPM bog'liqliklarni semantik versiyalash (SemVer) bo'yicha hal qiladi, manba kodini keshlaydi va paketlarni parallel qurib tezlashtiradi.
  • Buyruqlar: swift package init (paket yaratish), swift package update (bog'liqliklarni yangilash), swift build (qurish), swift test (testlarni ishga tushirish).
  • CocoaPods/Carthage-dan SPM-ga migratsiya Xcode orqali: File → Add Package Dependency, so'ngra podfile va Cartfile o'chiriladi.

SPM nima?

SPM (Swift Package Manager) — Swift tili uchun rasmiy paket menejeri, swiftc kompilyatori va Xcode ishlab chiqish muhitiga o'rnatilgan. U dasturchilarga uchinchi tomon kutubxonalarini ulash, ularning versiyalarini boshqarish va o'z paketlarini nashr etish imkonini beradi. SPM birinchi marta Swift 3.0 da (sentyabr 2016) buyruq qatori vositasi sifatida paydo bo'lgan, Xcode 11 dan (2019) boshlab esa grafik interfeys bilan to'liq integratsiyani olgan — endi bog'liqliklar File → Add Packages menyusi orqali qo'shiladi.

SPM bog'liqliklarning manba kodini Git omborlaridan avtomatik yuklab oladi, ularni asosiy loyiha bilan parallel qurib, natijalarni keshlaydi, shunda qayta qurishlar tezroq bo'ladi. CocoaPods-dan farqli o'laroq, SPM alohida workspace (xcworkspace) yaratmaydi — bog'liqliklar asosiy Xcode loyihasining bir qismiga aylanadi. Swift.org Developer Survey (2024) so'roviga ko'ra, SPM dan iOS dasturchilarining 67% foydalanadi, bu uni Swift ekotizimida bog'liqliklarni boshqarishning eng mashhur vositasiga aylantiradi.

SPM uchta platformani qo'llab-quvvatlaydi: Apple (iOS, macOS, tvOS, watchOS, visionOS), Linux (Ubuntu, CentOS, Amazon Linux) va server Swift (Vapor, Kitura). Linux da SPM Xcode siz to'liq buyruq qatori orqali ishlaydi.

Swift Package Manager qanday ishlaydi

SPM uchta asosiy tushuncha atrofida qurilgan: paketlar (packages), mahsulotlar (products) va maqsadlar (targets). Paket — Package.swift manifesti bo'lgan Git ombori. Mahsulot — qurish natijasi (kutubxona yoki bajariladigan fayl). Maqsad — paket ichidagi qurish birligiga kompilyatsiya qilinadigan modul.

Dasturchi Package.swift ga bog'liqlik qo'shganda, SPM quyidagi qadamlarni bajaradi:

  1. Klonlash — SPM ko'rsatilgan URL bo'yicha bog'liqlikning Git omborini yuklab oladi.
  2. Versiyalarni hal qilish — SemVer teglarini (masalan, 2.1.3) tahlil qiladi va ko'rsatilgan diapazon ichida mos versiyani tanlaydi.
  3. Tranzitiv hal qilish — bog'liqliklarning bog'liqliklarini tekshiradi va versiya ziddiyatlarsiz grafik quradi.
  4. Keshlash — yuklangan manba kodini ~Library/Caches/org.swift.swiftpm/ da saqlaydi.
  5. Kompilyatsiya — paketning barcha maqsadlarini asosiy loyihaning bayroqlari bilan quradi.

Package.resolved fayli barcha bog'liqliklarning aniq versiyalarini belgilab qo'yadi, shunda dasturchilar jamoasi bir xil kutubxonalar to'plami bilan ishlaydi. Bu fayl versiya nazorati tizimiga (git) qo'shilishi kerak.

SPM ning analoglardan asosiy ustunligi — markazlashtirilgan reestrning yo'qligi. Paketlar har qanday ochiq Git omborida joylashishi mumkin: GitHub, GitLab, Bitbucket, shuningdek kompaniyaning o'z Git serverlarida. Swift 5.2 versiyasidan boshlab SPM ikkilik bog'liqliklarni (binary targets) qo'llab-quvvatlaydi — manba kodini taqdim etmasdan XCFramework orqali tarqatiladigan yopiq kutubxonalar.

Package.swift — loyiha manifesti

Package.swift — paket tuzilishi va uning bog'liqliklarini tavsiflovchi Swift fayli. Fayl Swift tilida yoziladi (JSON emas, YAML emas), bu manifest ichida shartli mantiq, hisoblanadigan konstantalar va funksiyalardan foydalanish imkonini beradi.

Package.swift asosiy tuzilishi:

swift
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v16),
        .macOS(.v13)
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]
        ),
    ],
    dependencies: [
        .package(url: "https://github.com/Alamofire/Alamofire.git",
                 from: "5.9.0"),
        .package(url: "https://github.com/onevcat/Kingfisher.git",
                 from: "7.12.0"),
    ],
    targets: [
        .target(
            name: "MyLibrary",
            dependencies: [
                "Alamofire",
                "Kingfisher"
            ]
        ),
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]
        ),
    ]
)

Asosiy elementlarni ko'rib chiqamiz:

  • // swift-tools-version: 5.9 — SPM versiyasini ko'rsatuvchi direktiva; manifestning mavjud sintaksisi unga bog'liq.
  • name — Xcode da ko'rsatiladigan va bog'liqlik havolalarida ishlatiladigan paket nomi.
  • platforms — platformalarning minimal versiyalari; SPM eski OT versiyasida paketni qurishga ruxsat bermaydi.
  • products — paket "eksport qiladigan" narsa: kutubxona (.library) yoki bajariladigan fayl (.executable).
  • dependencies — URL va versiya bilan tashqi paketlar ro'yxati; from:, exact:, branch:, revision: qo'llab-quvvatlanadi.
  • targets — qurish maqsadlari; har bir maqsad bog'liqliklar, resurslar va tegishli katalogdagi (Sources/TargetName/) swift fayllari ro'yxatini o'z ichiga oladi.

Aniq versiya, tarmoq va kommitni ko'rsatish namunasi:

swift
dependencies: [
    .package(url: "https://github.com/pointfreeco/swift-snapshot-testing.git",
             exact: "1.17.3"),
    .package(url: "https://github.com/pointfreeco/swift-composable-architecture.git",
             branch: "main"),
    .package(url: "https://github.com/apple/swift-log.git",
             revision: "e5c6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4"),
]

Swift 5.9 versiyasidan boshlab Package.swift ga static/framework va linkerSettings qo'llab-quvvatlashi qo'shilgan, bu statik va dinamik kutubxonalar uchun linklashni aniqroq sozlash imkonini beradi.

SPM asosiy buyruqlari

Swift Package Manager terminal orqali ishlash uchun bir qator buyruqlarni taqdim etadi. Buyruqlar paketning ildiz katalogidan (Package.swift joylashgan joydan) ishga tushiriladi.

bash
# Kutubxona bilan yangi paket yaratish
swift package init --type library

# Bajariladigan paket yaratish (konsol dasturi)
swift package init --type executable

# Loyihani qurish
swift build

# Release konfiguratsiyasida qurish
swift build -c release

# Testlarni ishga tushirish
swift test

# Muayyan testni ishga tushirish
swift test --filter "MyLibraryTests/testExample"

# Bog'liqliklarni yuklab olish va hal qilish
swift package resolve

# Bog'liqliklarni eng so'nggi mavjud versiyalarga yangilash
swift package update

# Bog'liqlik grafigini ko'rsatish
swift package show-dependencies

# Qurish keshlarini tozalash
swift package clean

# Xcode loyihasini yaratish (Xcode 11 gacha)
swift package generate-xcodeproj

Xcode ichida ishlaganda, bu buyruqlarning aksariyati avtomatik bajariladi: bog'liqliklar loyiha ochilganda hal qilinadi, qurish ⌘B, testlar ⌘U bilan ishga tushiriladi. Biroq terminal buyruqlarini bilish CI/CD quvurlari (GitHub Actions, GitLab CI, Jenkins) uchun zarur, chunki Xcode mavjud emas.

swift package resolve buyrug'i Package.resolved faylini yaratadi yoki yangilaydi. Bu fayl barcha bog'liqliklarning, shu jumladan tranzitivlarning aniq versiyalarini belgilab qo'yadi va git ga qo'shilishi kerak. Har bir yangi feature tarmog'idan oldin swift package update ni ishga tushirish tavsiya etiladi, shunda kutubxonalarning joriy versiyalari bilan ishlaysiz.

O'z paketingizni yaratish

O'z SPM paketingizni yaratish ko'p modulli loyihalarda biznes mantiqini inkapsulyatsiya qilish va open-source kutubxonalarni nashr etish uchun foydalidir. Bosqichma-bosqich jarayonni ko'rib chiqamiz.

1-qadam: Inisializatsiya

bash
mkdir MyNetworkKit
cd MyNetworkKit
swift package init --type library

2-qadam: Katalog tuzilishi

swift package init buyrug'i quyidagi tuzilmani yaratadi:

text
MyNetworkKit/
├── Package.swift
├── README.md
├── Sources/
│   └── MyNetworkKit/
│       └── MyNetworkKit.swift
└── Tests/
    └── MyNetworkKitTests/
        └── MyNetworkKitTests.swift

SPM avtomatik ravishda Sources/ va Tests/ kataloglarini skanerlaydi: Sources ichidagi har bir pastki katalog maqsadga (target) mos keladi.

3-qadam: Package.swift ni tahrirlash

Bog'liqliklarni qo'shamiz va maqsadli platformalarni sozlaymiz:

swift
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "MyNetworkKit",
    platforms: [
        .iOS(.v15),
        .macOS(.v12)
    ],
    products: [
        .library(
            name: "MyNetworkKit",
            targets: ["MyNetworkKit"]
        ),
    ],
    dependencies: [
        .package(url: "https://github.com/Alamofire/Alamofire.git",
                 from: "5.9.0"),
    ],
    targets: [
        .target(
            name: "MyNetworkKit",
            dependencies: ["Alamofire"]
        ),
        .testTarget(
            name: "MyNetworkKitTests",
            dependencies: ["MyNetworkKit"]
        ),
    ]
)

4-qadam: Kod yozish

swift
// Sources/MyNetworkKit/MyNetworkKit.swift
import Foundation
import Alamofire

public struct NetworkClient {
    private let session: Session

    public init() {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30
        self.session = Session(configuration: configuration)
    }

    public func fetchData(from url: String) async throws -> Data {
        let response = try await session.request(url).serializingData().value
        return response
    }
}

5-qadam: Nashr qilish

Paketni Git omboriga suring va SemVer tegi yarating:

bash
git init
git add .
git commit -m "Initial commit: MyNetworkKit"
git remote add origin https://github.com/username/MyNetworkKit.git
git push -u origin main
git tag 1.0.0
git push --tags

Shundan so'ng, har qanday dasturchi sizning paketingizni .package(url: "https://github.com/username/MyNetworkKit.git", from: "1.0.0") orqali ulashi mumkin.

SPM dan foydalanish misollari

1-misol: Tarmoq so'rovlari uchun Alamofire ni ulash

Alamofire — Swift uchun eng mashhur HTTP mijoz. Uni SPM orqali qo'shamiz va GET so'rovini bajaramiz.

swift
import Alamofire

func fetchUsers() {
    AF.request("https://jsonplaceholder.typicode.com/users")
        .validate()
        .responseDecodable(of: [User].self) { response in
            switch response.result {
            case .success(let users):
                print("\(users.count) foydalanuvchi olindi")
            case .failure(let error):
                print("Xato: \(error.localizedDescription)")
            }
        }
}

2-misol: Swinject — bog'liqliklarni injeksiya qilish

Swinject kutubxonasi Swift uchun DI konteynerini taqdim etadi. .package(url: "https://github.com/Swinject/Swinject.git", from: "2.8.0") orqali ulanadi.

swift
import Swinject

let container = Container()
container.register(NetworkServiceProtocol.self) { _ in NetworkService() }
container.register(DataRepositoryProtocol.self) { r in
    DataRepository(networkService: r.resolve(NetworkServiceProtocol.self)!)
}

let repository = container.resolve(DataRepositoryProtocol.self)
repository?.loadData()

3-misol: Swift-log — strukturaviy loglash

Apple dan swift-log paketi — ko'plab backendlarni (OSLog, konsol, fayllar) qo'llab-quvvatlovchi yagona loglash API si.

swift
import Logging

var logger = Logger(label: "com.myapp.network")
logger.logLevel = .debug

logger.info("Tarmoq so'rovi boshlandi", metadata: [
    "url": "\(requestURL)",
    "method": "GET"
])

logger.warning("Javob vaqti 2 soniyadan oshdi")
logger.error("Ulanish xatosi: internet yo'q")

Bu uch misol SPM dan odatiy foydalanish stsenariylarini qamrab oladi: HTTP mijozlar, DI konteynerlari va tizim infratuzilmasi. Kutubxonalarni tanlash tasodifiy emas — Alamofire, Swinject va swift-log GitHub da eng ko'p yulduz to'plagan Swift paketlari top 20 ligiga kiradi.

CocoaPods va Carthage-dan migratsiya

Agar loyiha CocoaPods yoki Carthage dan foydalansa, SPM ga migratsiya bir necha bosqichda amalga oshiriladi. Jarayon xavfsiz: SPM bog'liqliklari CocoaPods va Carthage bilan bitta loyihada birga mavjud bo'lishi mumkin, bu bosqichma-bosqich migratsiyaga imkon beradi.

CocoaPods → SPM

  1. Xcode da: File → Add Package Dependency, paket URL ini kiriting.
  2. Versiyani tanlang va paketni kerakli targets ga qo'shing.
  3. Barcha bog'liqliklarni SPM orqali qo'shgandan so'ng, Podfile dan qatorlarni o'chiring.
  4. .xcworkspace ni o'chiring, .xcodeproj ni oching va Clean Build Folder ni bajaring.

Carthage → SPM

  1. Xcode File → Add Package Dependency orqali paketlarni qo'shing.
  2. Cartfile dan bog'liqliklarni o'chiring.
  3. Build Phases dan Carthage qurish skriptlarini o'chiring.
  4. Keshni tozalang: terminalda rm -rf Carthage/.

2025 yil holatiga ko'ra, SPM mashhur Swift kutubxonalarining katta qismini qo'llab-quvvatlaydi. Istisnolar modul xaritasi (modulemap) bo'lmagan ba'zi ObjC freymvorklaridir. Agar kutubxona hali SPM ni qo'llab-quvvatlamasa — uning README faylidagi Installation bo'limini tekshiring; aksariyat mualliflar eng so'nggi versiyalarda SPM qo'llab-quvvatlashini qo'shgan.

Tez-tez beriladigan savollar

SPM CocoaPods va Carthage dan qanday farq qiladi?

SPM Swift kompilyatori va Xcode ga o'rnatilgan, gem yoki Homebrew orqali o'rnatishni talab qilmaydi. CocoaPods markazlashtirilgan Specs reestridan foydalanadi va alohida workspace yaratadi. Carthage loyiha bilan integratsiyasiz freymvorklar orqali ishlaydi. SPM kompilyator darajasida integratsiyalangan yagona menejer: bog'liqliklar hal qilinadi, keshlanadi va asosiy kod bilan parallel quriladi.

SPM Objective-C loyihalari uchun ishlatilishi mumkinmi?

Ha, SPM Swift + Objective-C aralash loyihalarini qo'llab-quvvatlaydi. SPM paketi ichidagi ObjC fayllari to'g'ri modulemap sharti bilan avtomatik ravishda Umbrella Header ga tushadi. Biroq SPM modul xaritasi bo'lmagan statik ObjC kutubxonalarini qo'llab-quvvatlamaydi. ObjC kutubxonalarini SPM orqali faqat modulemap taqdim etganda yoki sof C tilida yozilganda ulash tavsiya etiladi.

SPM versiya ziddiyatlarini qanday hal qiladi?

SPM semantik versiyalashdan (SemVer) foydalanadi. Agar A paketi Alamofire 5.8+ talab qilsa, B paketi esa Alamofire 5.9+ talab qilsa, SPM ikkalasini ham qoniqtiradigan 5.9.x versiyasini tanlaydi. Agar ziddiyat hal qilib bo'lmasa (bir paket 5.x, ikkinchisi 6.x talab qilsa), SPM xato haqida xabar beradi. Bunday holda paketlardan birini yangilash yoki bog'liqlikni ikkala talabga ham mos versiyaga o'zgartirish kerak.

Yuklab olingan SPM paketlari qayerda saqlanadi?

macOS da: ~Library/Caches/org.swift.swiftpm/ va ~/Library/Developer/Xcode/DerivedData/. Linux da: ~cache/swiftpm/. Qurish paytida SPM manba kodini va kompilyatsiya qilingan ob'ekt fayllarini keshlaydi. Keshni to'liq tozalash uchun swift package reset ni bajaring — bu buyruq joriy loyiha uchun bog'liqlik keshi va DerivedData ni o'chiradi.

SPM yopiq (proprietar) kutubxonalarni qo'llab-quvvatlaydimi?

Ha, Swift 5.2 dan boshlab SPM ikkilik maqsadlarni (binary targets) qo'llab-quvvatlaydi. Yopiq kutubxona XCFramework sifatida yetkaziladi, Package.swift da esa .xcframework ga yo'l ko'rsatiladi. Manba kodi oshkor etilmaydi. Binary target .binaryTarget(name: "PrivateSDK", path: "Sources/PrivateSDK.xcframework") orqali ko'rsatiladi. Bu litsenziya shartnomalarini buzmasdan tijoriy SDK larni ulash imkonini beradi.

Xulosa

  • SPM (Swift Package Manager) — alohida o'rnatishni talab qilmaydigan, Xcode va kompilyator bilan integratsiyalangan o'rnatilgan Swift paket menejeri.
  • Package.swift — Swift tilidagi deklarativ manifest, paket nomi, platformalar, bog'liqliklar, mahsulotlar va qurish maqsadlarini tavsiflaydi.
  • SPM paket manbai sifatida Git omborlaridan foydalanadi va versiyalarni SemVer bo'yicha hal qiladi, takroriy qurishlarni tezlashtirish uchun manba kodini keshlaydi.
  • Asosiy buyruqlar: swift package init (paket yaratish), swift build (qurish), swift test (test qilish), swift package update (bog'liqliklarni yangilash).
  • O'z paketingiz swift package init orqali yaratiladi, Git da nashr etiladi va SemVer tegi bilan URL orqali boshqa loyihalar uchun mavjud.
  • CocoaPods/Carthage dan SPM ga migratsiya xavfsiz: bog'liqliklar birga mavjud bo'lishi mumkin, migratsiya Xcode da File → Add Package Dependency orqali amalga oshiriladi.
  • SPM — Swift ekotizimida bog'liqliklarni boshqarish standarti, iOS dasturchilarining 67% tomonidan qo'llaniladi (Swift.org Developer Survey, 2024).

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing