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.

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.
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.
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.
# 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.swiftChay 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.
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.
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.
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.
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.
Sẵn sàng chinh phục phỏng vấn iOS?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
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 tu dong danh muc cac package cong khai.
# 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: 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.
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.
# 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 nguonMoi 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.
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.zipBinary 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 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.
// 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 truoc khi bat dau.
# Truoc: Podfile
pod 'Alamofire', '~> 5.9'
pod 'SwiftyJSON', '~> 5.0'
pod 'Kingfisher', '~> 7.0'// 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.0Xoa 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.resolvedde 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
testTargetde 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
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.swiftsu 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.resolvedkhoa 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 va lap trinh huong protocol tren SharpSkill.
Bắt đầu luyện tập!
Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.
Bạn có tìm ra lỗi trong iOS không?
Một đoạn mã thật, một lỗi ẩn, mỗi ngày một lượt. Không cần tài khoản để thử.

Viết bởi
Anthony Fillion-MailletNgười sáng lập SharpSkill
Lập trình viên fullstack hơn 10 năm. Anh điều hành SharpSkill và chịu trách nhiệm về mọi nội dung đăng tại đây.
Cập nhật ngày 20 tháng 9, 2026
Chia sẻ
Bài viết liên quan

CloudKit với SwiftUI năm 2026: các mẫu đồng bộ dữ liệu giữa các thiết bị
Hướng dẫn đầy đủ để triển khai đồng bộ CloudKit với SwiftUI: CKSyncEngine, tích hợp SwiftData, giải quyết xung đột và thực hành tốt nhất cho iOS 2026.

Combine vs async/await trong Swift: Mẫu Hình Di Cư Tiến Bộ
Hướng dẫn đầy đủ về di cư từ Combine sang async/await trong Swift: chiến lược tiến bộ, mẫu hình bắc cầu và sự cùng tồn tại của các mô hình trong codebase iOS.

Câu hỏi phỏng vấn về khả năng tiếp cận iOS năm 2026: VoiceOver và Dynamic Type
Chuẩn bị phỏng vấn iOS với những câu hỏi then chốt về khả năng tiếp cận: VoiceOver, Dynamic Type, các trait ngữ nghĩa và kiểm thử.