# 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. - Published: 2026-09-20 - Updated: 2026-09-20 - Author: Anthony Fillion-Maillet - Reading time: 5 min --- 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. > **SPM Ne Yapar** > > 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. ```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"] ) ] ) ``` `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. ```bash # 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.swift ``` `swift 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. ```swift // Package.swift 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. > **Prodüksiyonda Dal Bağımlılıkları** > > 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. ```swift // AppDelegate.swift 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. ```swift // Tüketen paketteki Package.swift 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. ## 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](https://swiftpackageindex.com) genel paketleri otomatik olarak indeksler. ```bash # 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](https://semver.org) 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. ```swift // Swift 6.2+ özellikleriyle Package.swift 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. ```bash # 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'leri ``` Kurumsal 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. ```swift // Binary hedefli Package.swift 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.zip ``` Binary 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](https://developer.apple.com/documentation/xcode/swift-packages) 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. ```swift // 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](https://swiftpackageindex.com)'te kullanılabilirliği doğrulayın. ```ruby # Önce: Podfile pod 'Alamofire', '~> 5.9' pod 'SwiftyJSON', '~> 5.0' pod 'Kingfisher', '~> 7.0' ``` ```swift // 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.0 ``` Geç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ı `testTarget` kullanarak 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 Araçları Sürümü** > > `// 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.swift` manifesti 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](/technologies/ios/interview-questions/swiftui-state-management) ve [protokol odaklı programlama](/technologies/ios/interview-questions/protocol-oriented-programming) modüllerini inceleyin. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/tr/blog/ios/swift-package-manager-tutorial-2026