2026'da Swift Package Manager: Oluşturma, Yayınlama ve Mülakat Soruları
Bu kapsamlı rehberle Swift Package Manager konusunda uzmanlaşın. Paket oluşturmayı, bağımlılık yönetimini, kütüphane yayınlamayı ve SPM hakkındaki iOS mülakat sorularına hazırlanmayı öğrenin.

Swift Package Manager (SPM), Swift projeleri için bağımlılık yönetimi ve paket dağıtımını üstlenir. CocoaPods veya Carthage'ın aksine SPM, Xcode ve Swift araç zincirine doğrudan entegre olup harici kurulum gerektirmez. Swift 6.2 ve 6.3, katı bellek güvenliği ayarları, varsayılan aktör izolasyonu ve yeni Swift Build sistemini tanıtarak SPM'i modern iOS geliştirme için kesin tercih haline getirmiştir.
Swift Package Manager bağımlılıkları çözümler, kaynak kodunu indirir, modülleri derler ve bunları nihai binary'ye bağlar. Tek bir Package.swift manifest dosyası her şeyi tanımlar: bağımlılıklar, hedefler, ürünler ve derleme ayarları.
Package.swift Manifest Yapısı ve Sözdizimi
Her Swift paketi, repository kök dizinindeki bir Package.swift dosyasıyla başlar. Bu manifest, paket yapısını, bağımlılıkları ve derleme yapılandırmasını bildirmek için Swift kodu kullanır.
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"]
)
]
)platforms dizisi minimum dağıtım hedeflerini belirtir. products bölümü diğer paketlerin import edebileceği şeyleri tanımlar. targets bölümü ilgili bağımlılıklarıyla derleme birimlerini listeler.
Komut Satırından Swift Paketi Oluşturma
swift package init komutu, standart dizin yapısıyla yeni bir paket iskeleti oluşturur. --type bayrağı, paketin bir kütüphane mi yoksa yürütülebilir dosya mı üreteceğini belirler.
# Kütüphane paketi oluşturma
mkdir NetworkKit && cd NetworkKit
swift package init --type=library
# Oluşturulan yapı:
# NetworkKit/
# ├── Package.swift
# ├── Sources/
# │ └── NetworkKit/
# │ └── NetworkKit.swift
# └── Tests/
# └── NetworkKitTests/
# └── NetworkKitTests.swiftswift build çalıştırmak paketi derler. swift test çalıştırmak test paketini yürütür. Her iki komut da ek kurulum olmadan Package.swift'ten yapılandırmayı kullanır.
Bağımlılık Sürüm Gereksinimleri ve Çözümleme
SPM üç sürüm belirleme stratejisini destekler: kesin sürüm, sürüm aralığı ve dal veya commit referansı. Seçim, tekrarlanabilirliği ve esnekliği etkiler.
dependencies: [
// Semantik sürümleme: 5.9.0'dan sonraki majör sürüme kadar
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0"),
// Kesin sürüm: 5.9.1'e kilitli
.package(url: "https://github.com/Alamofire/Alamofire.git", exact: "5.9.1"),
// Sürüm aralığı: 5.8.0'dan 5.9.9'a
.package(url: "https://github.com/Alamofire/Alamofire.git", "5.8.0".."5.9.9"),
// Dal referansı: geliştirme için
.package(url: "https://github.com/Alamofire/Alamofire.git", branch: "main"),
// Commit referansı: belirli commit'e sabitlenmiş
.package(url: "https://github.com/Alamofire/Alamofire.git", revision: "abc123")
]Package.resolved dosyası, bağımlılık çözümleme sırasında belirlenen kesin sürümleri kaydeder. Bu dosya, ekip üyeleri ve CI sistemleri arasında tekrarlanabilir derlemeler için sürüm kontrolüne commit edilmelidir.
Dal ve commit referansları semantik sürümlemeyi atlar. Bir prodüksiyon uygulamasında branch: "main" kullanmak, main'e yapılan herhangi bir push'un derlemeyi bozabileceği anlamına gelir. Dal referanslarını yayınlanmamış özelliklere karşı aktif geliştirme için saklayın.
Xcode Projesine Paket Ekleme
Xcode, SPM'i File menüsü üzerinden entegre eder. File'a, ardından Add Package Dependencies'e gidin. Repository URL'sini girin, sürüm kuralını seçin ve hangi hedeflerin bağımlılığı bağlaması gerektiğini belirleyin.
import UIKit
import Alamofire // Xcode üzerinden ekledikten sonra kullanılabilir
@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, paket referanslarını .xcodeproj dosyasında ve çözümlenmiş sürümleri proje kökündeki Package.resolved içinde saklar. Derived Data klasörü indirilen paketleri önbelleğe alır.
Yol Bağımlılıklarıyla Yerel Paket Geliştirme
Geliştirme sırasında, uzak URL yerine yerel bir yola işaret etmek, ara sürümler yayınlamadan hızlı iterasyon sağlar. Bu teknik, monorepo kurulumları ve özellik geliştirme için uygundur.
dependencies: [
// Geliştirme için yerel yol
.package(path: "../NetworkKit"),
// Yayın için uzak URL
// .package(url: "https://github.com/company/NetworkKit.git", from: "1.0.0")
]Yerel ve uzak bağımlılıklar arasında geçiş, aktif olmayan satırı yorum haline getirerek yapılır. Xcode ve Swift CLI, yol bağımlılıklarını tüketen pakete göre çözümler.
iOS mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
GitHub'da Swift Paketi Yayınlama
Yayınlama, semantik sürüm etiketleri olan bir Git repository gerektirir. SPM, Git etiketlerini yayın sürümleri olarak ele alır. Swift Package Index genel paketleri otomatik olarak indeksler.
# Repository başlatma ve 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
# Sürüm etiketi oluşturma
git tag 1.0.0
git push origin 1.0.0
# Diğer paketler artık şuna bağımlı olabilir:
# .package(url: "https://github.com/username/NetworkKit.git", from: "1.0.0")Semantik sürümleme kurallarına uyun: geriye uyumsuz değişiklikler için majör sürümü, yeni özellikler için minör sürümü ve hata düzeltmeleri için yama sürümünü artırın. SPM, from: sürüm gereksinimlerini çözümlerken bu kurallara uyulduğunu varsayar.
Swift 6.2 ve 6.3 Paket Ayarları
Swift 6.2, hedef başına dil modu yapılandırması ve katı bellek güvenliği ayarlarını tanıttı. Swift 6.3, isteğe bağlı bir derleme sistemi olarak Swift Build entegrasyonunu ekler.
import PackageDescription
let package = Package(
name: "SafeNetworkKit",
platforms: [.iOS(.v17)],
products: [
.library(name: "SafeNetworkKit", targets: ["SafeNetworkKit"])
],
targets: [
.target(
name: "SafeNetworkKit",
swiftSettings: [
// Yalnızca bu hedef için Swift 6 dil modunu etkinleştir
.swiftLanguageMode(.v6),
// Katı bellek güvenliği kontrolünü etkinleştir (SE-0458)
.enableExperimentalFeature("StrictMemorySafety"),
// Varsayılan aktör izolasyonunu ayarla (SE-0466)
.enableExperimentalFeature("GlobalActorIsolation")
]
)
]
)swiftLanguageMode ayarı, kod tabanı genelinde Swift 6 özelliklerinin kademeli olarak benimsenmesini sağlar. Hedefler aynı paket içinde farklı dil modları kullanabilir.
Güvenlik Uyumluluğu için SBOM Oluşturma
SE-0509, Swift 6.3'te yerel Software Bill of Materials oluşturmayı ekledi. SBOM belgeleri, güvenlik denetimi ve düzenleyici uyumluluk için tüm bağımlılıkları ve sürümlerini listeler.
# CycloneDX formatında SBOM oluşturma
swift build --sbom-spec cyclonedx
# Özel alt komut kullanarak SBOM oluşturma
swift package generate-sbom --format spdx
# Çıktı şunları içerir:
# - Paket adı ve sürümü
# - Tüm geçişli bağımlılıklar
# - Lisans bilgileri
# - Kaynak repository URL'leriKurumsal ortamlar ve devlet sözleşmeleri giderek daha fazla SBOM dokümantasyonu gerektirmektedir. CycloneDX ve SPDX formatları standart güvenlik açığı tarama araçlarıyla entegre olur.
Binary Hedefler ve XCFramework Dağıtımı
Binary hedefler, kaynak kod yerine önceden derlenmiş framework'lerin dağıtımına olanak tanır. XCFramework'ler birden fazla platform ve mimari için binary'leri paketler.
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..."
)
]
)
// Checksum oluşturma:
// swift package compute-checksum AnalyticsSDK-2.0.0.xcframework.zipBinary hedefler, tüketiciler için derleme sürelerini azaltır ve tescilli uygulamaları korur. Checksum, indirme bütünlüğünü sağlar.
Swift Package Manager Hakkında Yaygın Mülakat Soruları
iOS pozisyonları için teknik mülakatlar sıklıkla SPM sorularını içerir. Bu sorular temel kullanımdan mimari kararlara kadar uzanır.
S: SPM, CocoaPods ve Carthage'dan nasıl farklıdır?
SPM, harici araçlar olmadan Xcode ve Swift araç zincirine entegre olur. CocoaPods merkezi bir spec repository'si kullanır ve Xcode workspace yapısını değiştirir. Carthage, Xcode entegrasyonu olmadan ayrı bir adımda framework'leri derler. SPM, bağımlılıkları çözümler ve tek bir birleşik süreçte derler. Swift paketleri hakkında Apple dokümantasyonu resmi araçları kapsar.
S: Bağımlılık çözümleme sırasında ne olur?
SPM, bir bağımlılık grafiği oluşturarak Package.swift manifestlerini özyinelemeli olarak okur. Ardından tüm paketler için uyumlu sürümleri bulmak üzere sürüm kısıtlamalarını uygular. Çözümleyici, kesin sürümleri Package.resolved'a yazar. İki paket paylaşılan bir bağımlılığın uyumsuz sürümlerini gerektirdiğinde çakışmalar oluşur.
S: Elmas bağımlılık çakışması nasıl çözülür?
A ve B paketi, uyumsuz sürüm gereksinimleriyle C paketine bağımlı olduğunda SPM çözümleme başarısız olur. Çözümler şunları içerir: bir tüketiciyi daha geniş bir sürüm aralığını desteklemek için güncellemek, kısıtlayıcı paketi fork'lamak veya çakışma aynı modül adına sahip farklı paketler arasındaysa modül takma adları kullanmak.
// Ad çakışmaları için modül takma adı kullanımı
.target(
name: "MyApp",
dependencies: [
.product(name: "Logging", package: "swift-log", moduleAliases: ["Logging": "SwiftLogging"])
]
)S: Kaynak dağıtımı yerine ne zaman binary hedef kullanılmalı?
Binary hedefler, kaynak ifşasının kabul edilemez olduğu tescilli SDK'lar, derleme süresinin geliştirici verimliliğini etkilediği büyük bağımlılıklar ve önceden derlenmiş satıcı kütüphaneleri için uygundur. Kaynak dağıtımı, bağımlılıklarda hata ayıklamanın değer kattığı açık kaynak projeleri ve dahili kütüphaneler için tercih edilir kalır.
CocoaPods'tan Swift Package Manager'a Geçiş
Geçiş, Podfile girişlerinin SPM paket referanslarıyla değiştirilmesini gerektirir. Tüm CocoaPods'ların SPM eşdeğerleri yoktur, bu nedenle başlamadan önce Swift Package Index'te kullanılabilirliği doğrulayın.
# Önce: Podfile
pod 'Alamofire', '~> 5.9'
pod 'SwiftyJSON', '~> 5.0'
pod 'Kingfisher', '~> 7.0'// Sonra: Xcode'da paket bağımlılıkları
// Her biri için File > Add Package Dependencies:
// 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.0Geçişten sonra Podfile, Podfile.lock ve Pods dizinini kaldırın. pod deintegrate çalıştırmak CocoaPods workspace değişikliklerini kaldırır. Swift dosyalarındaki import ifadeleri değişmeden kalır.
Prodüksiyon Uygulamaları için SPM En İyi Uygulamaları
- Minör güncellemeler ve yamalar alırken stabilite için
from:ile majör sürümleri sabitleyin - Ekip genelinde tekrarlanabilir derlemeler sağlamak için
Package.resolved'ı commit edin - Aktif geliştirme sırasında yerel paketleri kullanın, birleştirmeden önce uzak URL'lere geçin
- Yayın derlemelerine dahil edilmelerini önlemek için test-only bağımlılıkları
testTargetkullanarak ayırın - Manifest üstünde minimum Swift araçları sürümünü belgeleyin:
// swift-tools-version: 5.10 - Sürüm etiketlemeden önce CI'da paket derlemelerini doğrulayın
// swift-tools-version: yorumu Package.swift'in ilk satırında görünmelidir. Manifestin hangi PackageDescription API sürümünü kullandığını belirler. Swift 6.0, lisans başlıkları için bu yorumun sonraki satırlarda olmasına izin veren esneklik ekledi.
SPM Kullanan iOS Geliştiricileri için Temel Çıkarımlar
- SPM, Xcode'a yerel olarak entegre olarak CocoaPods ve Carthage kurulum yükünü ortadan kaldırır
Package.swiftmanifesti Swift kodu kullanarak tip-kontrollü bağımlılık bildirimleri sağlar- Sürüm gereksinimleri semantik sürüm aralıklarını, kesin sürümleri ve dal referanslarını destekler
Package.resolved, tekrarlanabilir derlemeler için bağımlılık sürümlerini kilitler- Swift 6.2, hedef başına dil modları ve katı bellek güvenliği ayarları ekledi
- Swift 6.3, uyumluluk dokümantasyonu için SBOM oluşturmayı tanıttı
- Binary hedefler, kaynak dağıtımı pratik olmadığında önceden derlenmiş XCFramework'leri dağıtır
- Mülakat soruları çözümleme çakışmaları, geçiş stratejileri ve SPM ile alternatifler arasındaki mimari ödünleşimlere odaklanır
Kapsamlı iOS mülakat hazırlığı için SharpSkill'deki SwiftUI durum yönetimi ve protokol odaklı programlama modüllerini inceleyin.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
iOS kodundaki hatayı bulabilir misin?
Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Yazan:
Anthony Fillion-MailletSharpSkill kurucusu
10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.
20 Eylül 2026 tarihinde güncellendi
Paylaş
İlgili makaleler

2026'da SwiftUI ile CloudKit: cihazlar arası veri senkronizasyon desenleri
SwiftUI ile CloudKit senkronizasyonunu uygulamak için kapsamlı kılavuz: CKSyncEngine, SwiftData entegrasyonu, çakışma çözümü ve iOS 2026 için en iyi uygulamalar.

Swift'te Combine vs async/await: Aşamalı Geçiş Desenleri
Swift'te Combine'dan async/await'e geçiş için kapsamlı kılavuz: aşamalı stratejiler, köprüleme desenleri ve iOS kod tabanlarında paradigma birlikte yaşamı.

2026'da iOS Erişilebilirlik Mülakat Soruları: VoiceOver ve Dynamic Type
iOS mülakatlarına hazırlık için kritik erişilebilirlik soruları: VoiceOver, Dynamic Type, semantik trait'ler ve denetimler.