# Swift Package Manager 2026: Tao, Phat hanh va Cau hoi Phong van > Lam chu Swift Package Manager voi huong dan toan dien nay. Tim hieu cach tao package, quan ly dependency, phat hanh thu vien va chuan bi cho phong van iOS. - Published: 2026-09-20 - Updated: 2026-09-20 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- Swift Package Manager (SPM) xu ly viec quan ly dependency va phan phoi package cho cac du an Swift. Khac voi CocoaPods hoac Carthage, SPM tich hop truc tiep vao Xcode va toolchain Swift, khong can cai dat them bat ky cong cu nao. Swift 6.2 va 6.3 da gioi thieu cac thiet lap an toan bo nho nghiem ngat, co lap actor mac dinh va he thong Swift Build moi, bien SPM thanh lua chon hang dau cho phat trien iOS hien dai. > **SPM Lam Gi** > > Swift Package Manager giai quyet dependency, tai ma nguon, bien dich module va lien ket chung vao binary cuoi cung. Mot file manifest `Package.swift` duy nhat dinh nghia tat ca: dependency, target, product va cac thiet lap build. ## Cau Truc va Cu Phap Manifest Package.swift Moi Swift package bat dau voi file `Package.swift` tai thu muc goc cua repository. Manifest nay su dung ma Swift de khai bao cau truc package, dependency va cau hinh build. ```swift // Package.swift import PackageDescription let package = Package( name: "NetworkKit", platforms: [ .iOS(.v15), .macOS(.v12) ], products: [ .library( name: "NetworkKit", targets: ["NetworkKit"] ) ], dependencies: [ .package( url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0" ) ], targets: [ .target( name: "NetworkKit", dependencies: ["Alamofire"] ), .testTarget( name: "NetworkKitTests", dependencies: ["NetworkKit"] ) ] ) ``` Mang `platforms` chi dinh cac muc tieu trien khai toi thieu. Phan `products` dinh nghia nhung gi ma cac package khac co the import. Phan `targets` liet ke cac don vi bien dich voi cac dependency tuong ung. ## Tao Swift Package Tu Command Line Lenh `swift package init` tao khung cho package moi voi cau truc thu muc chuan. Flag `--type` xac dinh package se tao ra library hay executable. ```bash # Tao library package mkdir NetworkKit && cd NetworkKit swift package init --type=library # Cau truc duoc tao: # NetworkKit/ # ├── Package.swift # ├── Sources/ # │ └── NetworkKit/ # │ └── NetworkKit.swift # └── Tests/ # └── NetworkKitTests/ # └── NetworkKitTests.swift ``` Chay `swift build` de bien dich package. Chay `swift test` de thuc thi bo test. Ca hai lenh deu su dung cau hinh tu `Package.swift` ma khong can thiet lap them. ## Yeu Cau Phien Ban Dependency va Giai Quyet SPM ho tro ba chien luoc chi dinh phien ban: phien ban chinh xac, pham vi phien ban va tham chieu branch hoac commit. Lua chon nay anh huong den kha nang tai tao va tinh linh hoat. ```swift // Package.swift dependencies: [ // Semantic versioning: 5.9.0 cho den major tiep theo .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0"), // Phien ban chinh xac: khoa o 5.9.1 .package(url: "https://github.com/Alamofire/Alamofire.git", exact: "5.9.1"), // Pham vi phien ban: 5.8.0 den 5.9.9 .package(url: "https://github.com/Alamofire/Alamofire.git", "5.8.0".."5.9.9"), // Tham chieu branch: cho phat trien .package(url: "https://github.com/Alamofire/Alamofire.git", branch: "main"), // Tham chieu commit: ghim vao commit cu the .package(url: "https://github.com/Alamofire/Alamofire.git", revision: "abc123") ] ``` File `Package.resolved` ghi lai cac phien ban chinh xac duoc giai quyet trong qua trinh giai quyet dependency. File nay nen duoc commit vao version control de dam bao build co the tai tao tren toan bo thanh vien team va he thong CI. > **Branch Dependency Trong San Pham** > > Tham chieu branch va commit bo qua semantic versioning. Su dung `branch: "main"` trong ung dung san pham co nghia la bat ky push nao vao main deu co the lam hong build. Chi nen su dung tham chieu branch cho phat trien tich cuc voi cac tinh nang chua phat hanh. ## Them Package Vao Du An Xcode Xcode tich hop SPM thong qua menu File. Dieu huong den File, sau do Add Package Dependencies. Nhap URL repository, chon quy tac phien ban va chon cac target nao se lien ket dependency. ```swift // AppDelegate.swift import UIKit import Alamofire // Co san sau khi them qua Xcode @main class AppDelegate: UIResponder, UIApplicationDelegate { func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { AF.request("https://api.example.com/health").response { response in print(response.result) } return true } } ``` Xcode luu tru tham chieu package trong file `.xcodeproj` va cac phien ban da giai quyet trong `Package.resolved` tai thu muc goc du an. Thu muc Derived Data cache cac package da tai. ## Phat Trien Package Cuc Bo Voi Path Dependency Trong qua trinh phat trien, tro den path cuc bo thay vi URL tu xa cho phep lap nhanh ma khong can phat hanh cac phien ban trung gian. Ky thuat nay phu hop voi cau hinh monorepo va phat trien tinh nang. ```swift // Package.swift trong consuming package dependencies: [ // Path cuc bo cho phat trien .package(path: "../NetworkKit"), // URL tu xa cho phat hanh // .package(url: "https://github.com/company/NetworkKit.git", from: "1.0.0") ] ``` Chuyen doi giua dependency cuc bo va tu xa bang cach comment dong khong hoat dong. Xcode va Swift CLI giai quyet path dependency tuong doi voi consuming package. ## Phat Hanh Swift Package Len GitHub Viec phat hanh yeu cau repository Git voi cac tag phien ban ngu nghia. SPM coi cac tag Git la cac phien ban phat hanh. [Swift Package Index](https://swiftpackageindex.com) tu dong danh muc cac package cong khai. ```bash # Khoi tao repository va push git init git add . git commit -m "Initial commit" git remote add origin https://github.com/username/NetworkKit.git git push -u origin main # Tao tag phien ban git tag 1.0.0 git push origin 1.0.0 # Cac package khac bay gio co the phu thuoc vao: # .package(url: "https://github.com/username/NetworkKit.git", from: "1.0.0") ``` Tuan theo quy uoc [semantic versioning](https://semver.org): tang phien ban major cho breaking changes, minor cho tinh nang moi va patch cho sua loi. SPM gia dinh tuan thu cac quy tac nay khi giai quyet yeu cau phien ban `from:`. ## Cai Dat Package Swift 6.2 va 6.3 Swift 6.2 gioi thieu cau hinh che do ngon ngu theo tung target va cai dat an toan bo nho nghiem ngat. Swift 6.3 them tich hop Swift Build nhu he thong build tuy chon. ```swift // Package.swift voi tinh nang Swift 6.2+ import PackageDescription let package = Package( name: "SafeNetworkKit", platforms: [.iOS(.v17)], products: [ .library(name: "SafeNetworkKit", targets: ["SafeNetworkKit"]) ], targets: [ .target( name: "SafeNetworkKit", swiftSettings: [ // Kich hoat che do ngon ngu Swift 6 chi cho target nay .swiftLanguageMode(.v6), // Kich hoat kiem tra an toan bo nho nghiem ngat (SE-0458) .enableExperimentalFeature("StrictMemorySafety"), // Dat co lap actor mac dinh (SE-0466) .enableExperimentalFeature("GlobalActorIsolation") ] ) ] ) ``` Cai dat `swiftLanguageMode` cho phep ap dung dan cac tinh nang Swift 6 tren toan bo codebase. Cac target co the su dung cac che do ngon ngu khac nhau trong cung mot package. ## Tao SBOM Cho Tuan Thu Bao Mat SE-0509 da them tinh nang tao Software Bill of Materials tu nhien trong Swift 6.3. Tai lieu SBOM liet ke tat ca dependency va phien ban cua chung de kiem toan bao mat va tuan thu quy dinh. ```bash # Tao SBOM theo dinh dang CycloneDX swift build --sbom-spec cyclonedx # Tao SBOM su dung subcommand rieng swift package generate-sbom --format spdx # Ket qua bao gom: # - Ten va phien ban package # - Tat ca dependency bat cau # - Thong tin giay phep # - URL repository nguon ``` Moi truong doanh nghiep va hop dong chinh phu ngay cang yeu cau tai lieu SBOM. Dinh dang CycloneDX va SPDX tich hop voi cac cong cu quet lo hong tieu chuan. ## Binary Target va Phan Phoi XCFramework Binary target cho phep phan phoi framework da bien dich thay vi ma nguon. XCFramework dong goi binary cho nhieu nen tang va kien truc. ```swift // Package.swift voi binary target import PackageDescription let package = Package( name: "AnalyticsSDK", platforms: [.iOS(.v14)], products: [ .library(name: "AnalyticsSDK", targets: ["AnalyticsSDK"]) ], targets: [ .binaryTarget( name: "AnalyticsSDK", url: "https://releases.example.com/AnalyticsSDK-2.0.0.xcframework.zip", checksum: "abc123def456..." ) ] ) // Tao checksum: // swift package compute-checksum AnalyticsSDK-2.0.0.xcframework.zip ``` Binary target giam thoi gian build cho nguoi dung va bao ve cac trien khai doc quyen. Checksum dam bao tinh toan ven cua qua trinh tai xuong. ## Cac Cau Hoi Phong Van Pho Bien Ve Swift Package Manager Phong van ky thuat cho cac vi tri iOS thuong bao gom cac cau hoi ve SPM. Cac cau hoi nay trai dai tu cach su dung co ban den cac quyet dinh kien truc. **Q: SPM khac gi so voi CocoaPods va Carthage?** SPM tich hop vao Xcode va toolchain Swift ma khong can cong cu ben ngoai. CocoaPods su dung repository spec trung tam va sua doi cau truc workspace Xcode. Carthage build framework trong buoc rieng biet ma khong tich hop Xcode. SPM giai quyet dependency va build trong mot quy trinh thong nhat. [Tai lieu Apple ve Swift packages](https://developer.apple.com/documentation/xcode/swift-packages) bao gom cong cu chinh thuc. **Q: Dieu gi xay ra trong qua trinh giai quyet dependency?** SPM doc manifest `Package.swift` de quy, xay dung do thi dependency. Sau do ap dung cac rang buoc phien ban de tim cac phien ban tuong thich cho tat ca package. Resolver ghi cac phien ban chinh xac vao `Package.resolved`. Xung dot xay ra khi hai package yeu cau cac phien ban khong tuong thich cua mot dependency dung chung. **Q: Lam the nao de xu ly xung dot diamond dependency?** Khi package A va B deu phu thuoc vao package C voi yeu cau phien ban khong tuong thich, giai quyet SPM that bai. Cac giai phap bao gom: cap nhat mot consumer de ho tro pham vi phien ban rong hon, fork package han che hoac su dung module aliasing neu xung dot giua cac package khac nhau co cung ten module. ```swift // Module aliasing cho xung dot ten .target( name: "MyApp", dependencies: [ .product(name: "Logging", package: "swift-log", moduleAliases: ["Logging": "SwiftLogging"]) ] ) ``` **Q: Khi nao nen su dung binary target thay vi phan phoi ma nguon?** Binary target phu hop voi SDK doc quyen khi khong chap nhan lo ma nguon, dependency lon khi thoi gian bien dich anh huong nang suat developer va cac thu vien vendor da bien dich. Phan phoi ma nguon van duoc ua chuong hon cho cac du an ma nguon mo va thu vien noi bo khi debug vao dependency mang lai gia tri. ## Di Chuyen Tu CocoaPods Sang Swift Package Manager Di chuyen yeu cau thay the cac muc Podfile bang tham chieu package SPM. Khong phai tat ca CocoaPods deu co tuong duong SPM, vi vay hay xac minh kha dung tren [Swift Package Index](https://swiftpackageindex.com) truoc khi bat dau. ```ruby # Truoc: Podfile pod 'Alamofire', '~> 5.9' pod 'SwiftyJSON', '~> 5.0' pod 'Kingfisher', '~> 7.0' ``` ```swift // Sau: Package dependency trong Xcode // File > Add Package Dependencies cho moi: // https://github.com/Alamofire/Alamofire.git from 5.9.0 // https://github.com/SwiftyJSON/SwiftyJSON.git from 5.0.0 // https://github.com/onevcat/Kingfisher.git from 7.0.0 ``` Xoa Podfile, Podfile.lock va thu muc Pods sau khi di chuyen. Chay `pod deintegrate` de xoa cac sua doi workspace CocoaPods. Cau lenh import trong cac file Swift van khong doi. ## Cac Thuc Hanh Tot Nhat SPM Cho Ung Dung San Pham - Ghim phien ban major voi `from:` de on dinh trong khi nhan cac cap nhat minor va patch - Commit `Package.resolved` de dam bao build co the tai tao tren toan team - Su dung package cuc bo trong qua trinh phat trien tich cuc, chuyen sang URL tu xa truoc khi merge - Tach cac dependency chi dung cho test bang `testTarget` de tranh dong goi trong build phat hanh - Ghi tai lieu phien ban Swift tools toi thieu o dau manifest: `// swift-tools-version: 5.10` - Xac nhan build package tren CI truoc khi tao tag phat hanh > **Swift Tools Version** > > Comment `// swift-tools-version:` phai xuat hien o dong dau tien cua Package.swift. No xac dinh phien ban API PackageDescription nao ma manifest su dung. Swift 6.0 da them tinh linh hoat cho phep comment nay o cac dong tiep theo cho header giay phep. ## Diem Chinh Cho Developer iOS Su Dung SPM - SPM tich hop vao Xcode tu nhien, loai bo chi phi thiet lap CocoaPods va Carthage - Manifest `Package.swift` su dung ma Swift, cho phep khai bao dependency duoc kiem tra kieu - Yeu cau phien ban ho tro pham vi semantic versioning, phien ban chinh xac va tham chieu branch - `Package.resolved` khoa phien ban dependency cho build co the tai tao - Swift 6.2 da them che do ngon ngu theo target va cai dat an toan bo nho nghiem ngat - Swift 6.3 gioi thieu tao SBOM cho tai lieu tuan thu - Binary target phan phoi XCFramework da bien dich khi phan phoi ma nguon khong thuc te - Cac cau hoi phong van tap trung vao xung dot giai quyet, chien luoc di chuyen va danh doi kien truc giua SPM va cac lua chon thay the De chuan bi phong van iOS toan dien, hay xem lai cac module [quan ly state SwiftUI](/technologies/ios/interview-questions/swiftui-state-management) va [lap trinh huong protocol](/technologies/ios/interview-questions/protocol-oriented-programming) tren SharpSkill. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/vi/blog/ios/swift-package-manager-tutorial-2026