Table of Contents
Introduzione alla gestione della dipendenza in iOS
Lo sviluppo iOS moderno raramente parte da zero. Le librerie di terze parti gestiscono tutto, dal networking e dalla parsing JSON ai componenti dell'interfaccia utente e al caching delle immagini. Senza un approccio strutturato, scaricando manualmente i framework, risolvendo i conflitti di versione e collegando i binari diventa rapidamente un incubo di manutenzione.
CocoaPods e Carthage sono i due strumenti più consolidati per la gestione delle dipendenze nei progetti iOS. Mentre CocoaPods offre una integrazione semplificata e basata sullo spazio di lavoro, Carthage segue una filosofia decentralizzata, build-it-yourself. Capire i punti di forza e gli scambi di ogni aiuta a scegliere l'approccio giusto per il vostro team, la vostra app e il vostro pipeline di distribuzione.
Cacaopoli: centralizzato e automatizzato
CocoaPods è il responsabile della dipendenza dominante sin dalla sua introduzione, che utilizza un indice centrale chiamato CocoaPods Specs e genera uno spazio di lavoro Xcode che gestisce automaticamente tutte le dipendenze. Ciò significa che è possibile aggiungere una libreria semplicemente dichiarandolo in un Podfile, eseguire un comando e iniziare immediatamente a importarlo nel codice.
Installazione e configurazione
CocoaPods è installato tramite RubyGems. macOS navi con Ruby, ma potrebbe essere necessario aggiornare o utilizzare un gestore di versioni Ruby.
sudo gem install cocoapods
Dopo l'installazione, naviga nella directory del tuo progetto e inizializza un Podfile:
pod init
Questo crea un file di testo chiaro chiamato Podfile[]]. Quindi modificarlo per specificare la piattaforma di destinazione, qualsiasi [] bandiera (richiesto per le librerie Swift), e le dipendenze di cui hai bisogno.
platform :ios, '15.0'
target 'MyApp' do
use_frameworks!
pod 'Alamofire', '~> 5.7'
pod 'SwiftyJSON', '~> 5.0'
pod 'SDWebImage', '~> 5.15'
end
Una volta che il Podfile è pronto, eseguire:
pod install
CocoaPods scarica le versioni specificate, risolve le dipendenze e genera un file . Da quel punto in poi, è necessario aprire lo spazio di lavoro, non l'originale ], per costruire ed eseguire la tua app.
Caratteristiche dei Cacao
- Subspecs:[ Molte librerie permettono di importare solo un sottoinsieme della loro funzionalità. Ad esempio, riduce l'impronta binaria.
- Carissimi percorsi:[] È possibile puntare ad una cartella locale per librerie private:
- Fonti basate su Git:[ Le dipendenze possono provenire da qualsiasi repository Git:
- Podfile.lock:[] Questo file blocca ogni dipendenza da una versione specifica, garantendo le costruzioni riproducibili in tutta la tua squadra e CI.
- Plugins:[] È possibile estendere CocoaPods con plugin per SwiftLint, Firebase, o script di costruzione personalizzati.
CocoaPods supporta anche obiettivi multipiattaforma. Puoi avere diversi set di dipendenza per iOS, macOS e watchOS nidificanti ] blocchi all'interno di un singolo Podfile.
Post-Install ganci e personalizzazione
Un bisogno comune è quello di eseguire uno script dopo ogni . Ad esempio, si potrebbe desiderare di strip simulatore architetture da release builds. Questo è fatto con un gancio:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
Tali ganci ti danno un controllo accurato sul progetto Pods generato, ma aggiungono anche complessità. L'uso eccessivo può rendere il tuo Podfile difficile da leggere e mantenere.
Cartagine: Decentralizzata e Hands-Off
Invece di centralizzare i metadati, si basa sui tag Git e sui progetti Xcode effettivi di ogni libreria. Carthage costruisce i quadri sulla macchina e lascia il passo di integrazione, tracciando i quadri nel tuo progetto Xcode, che ti sta solo a cuore. Questa interferenza minima è appellante agli sviluppatori che vogliono il pieno controllo e una minore impronta nel loro controllo della versione.
Installazione e configurazione
La carta è tipicamente installata tramite Homebrew:
brew install carthage
Successivamente, creare un file di testo chiaro chiamato []Cartfile[] nella vostra radice di progetto. La sintassi è simile a CocoaPods ma punti a repository GitHub o qualsiasi fonte Git:
github "Alamofire/Alamofire" ~> 5.7
github "SwiftyJSON/SwiftyJSON" ~> 5.0
github "onevcat/Kingfisher" ~> 7.0
Dopo aver modificato il Cartfile, eseguire:
carthage update --platform iOS
Questo comando clona i repository, controlla le versioni contrassegnate e costruisce i framework utilizzando Xcode. I binari che ne risultano vengono inseriti nella cartella [Carthage/Build/iOS[. Quindi trascinarli manualmente nel tuo progetto Xcode sotto la sezione "Frameworks, Libraries e Embedded Content", assicurandosi di aggiungerli al target appropriato.
Differenze chiave da CocoaPods
- Nessun workspace:[ Carthage non modifica il file di progetto.
- Velocità di costruzione:[[] Carthage può accumulare cache. Su CI, è possibile precostruire dipendenze per accelerare il processo di pipeline.
- Versione:[[] Carthage utilizza un [Cartfile.resolved[ per bloccare le versioni, simile a Podfile.lock.
- Quadri di base:[] Alcune librerie spediscono binari. Carthage può scaricare direttamente quelle, saltando il passo di costruzione e il tempo di risparmio.
- XC Supporto per la struttura:[ Dal momento che Carthage 0.38, può produrre XCFrameworks, che funziona senza soluzione di continuità con Swift Package Manager ed eliminare la necessità di strip simulator architetture.
Gestione di Quadri con Dipendenze
Se la libreria A dipende dalla libreria B, è necessario elencare entrambi nel Cartfile. Carthage risolve automaticamente l'albero di dipendenza, ma è ancora necessario collegare tutte le dipendenze transitive nel vostro progetto manualmente. Questo ti dà visibilità in ogni binario che la vostra applicazione collega, ma aumenta anche la possibilità di perdere un quadro richiesto a tempo di esecuzione.
Coccopoli e Cartagine a confronto: una guida pratica
La scelta tra i due dipende dalla dimensione del progetto, dalla maturità del team e dal flusso di lavoro di distribuzione.
| Factor | CocoaPods | Carthage |
|---|---|---|
| Setup complexity | Low – one command, workspace generated automatically. | Medium – requires manual linking of frameworks. |
| Build system control | Lower – CocoaPods merges project files and may override build settings. | Higher – you control project structure and build phases. |
| Integration with Xcode | Tight – workspace includes Pods project, all configurations preset. | Loose – you add frameworks manually; no workspace changes. |
| CI/CD compatibility | Good – pod install works reliably in CI, but full rebuild on each run if lockfile changes. |
Excellent – prebuilt frameworks can be cached; build times are faster. |
| Swift Package Manager migration | Can coexist but may cause conflicts if both manage the same library. | Can coexist more easily because Carthage does not modify project files. |
| Community and library availability | Widest coverage – almost every popular library has a CocoaPods spec. | Good coverage – but some niche libraries may not be Carthage-friendly. |
Quando usare CocoaPods
- State avviando un nuovo progetto e desiderate la caldaia minima.
- Il vostro team include sviluppatori junior che beneficiano di un'integrazione hands-off.
- Hai bisogno di una biblioteca che è disponibile solo tramite CocoaPods (si verificano ancora per alcuni pod legacy o proprietari).
- Si basano fortemente sui plugin CocoaPods (ad esempio, per i controlli lint o la generazione di codice).
Quando usare Cartagine
- Valori la modularità e vuoi evitare il "progetto Pods" galleggiante.
- La tua app è grande, e è necessario ottimizzare i tempi di costruzione tramite il caching framework precostruiti.
- Stai migrando a Swift Package Manager e vuoi una transizione graduale senza rompere le integrazioni esistenti.
- Lavori in un team che preferisce mantenere il progetto Xcode magra e gestire manualmente le impostazioni di costruzione.
Migrazione tra i manager della dipendenza
Passare da CocoaPods a Cartagine o viceversa è possibile ma richiede una pianificazione accurata.
Migrazione da CocoaPods a Cartagine
- Rimuovere il Podfile, Podfile.lock e lo spazio di lavoro.
- Rimuovere qualsiasi fase di costruzione relativa ai Pod (ad esempio, “Embed Pods Frameworks”).
- Creare un Cartfile e elencare le stesse librerie (assicurando che supportino Carthage).
- Corri .
- Aggiungi manualmente ogni framework dal Carthage/Build/iOS[ al progetto Xcode.
- Aggiorna tutte le dichiarazioni di importazione – sotto Cartagine, importa direttamente i quadri (ad esempio, ).
- Testa a fondo; le dipendenze transitive possono ora avere bisogno di un collegamento esplicito.
Migrazione da Cartagine a CocoaPods
- Rimuovere le fasi di costruzione e i riferimenti di struttura relativi alla Cartagine dal progetto Xcode.
- Eliminare il Cartfile e Cartfile.resolto.
- Eseguire per creare un Podfile.
- Aggiungere tutte le dipendenze con vincoli di versione appropriati.
- Eseguire e poi aprire il nuovo spazio di lavoro.
- Controllare le importazioni duplicate – CocoaPods può incorporare biblioteche in modo diverso.
- Modificare le impostazioni di build se necessario (ad esempio, ).
Migliori Pratiche per entrambi i manager
Indipendentemente da quale strumento si sceglie, seguendo queste pratiche manterrà il vostro progetto sano.
- Commettere file di blocco:[] Impedire sempre Podfile.lock o Cartfile.risolto al controllo della versione. Ciò garantisce che ogni membro del team e server CI utilizzi esattamente le stesse versioni.
- Le versioni di Pin con attenzione:[[]] Utilizzare operatori ottimisti ([[)]) per consentire aggiornamenti minori, bloccando le principali variazioni di rottura. Specificare le versioni esatte solo quando hai bisogno di stabilità assoluta.
- Aggiornamenti risolutivi deliberatamente:[] Non eseguire [ o [] senza rivedere i changelog delle dipendenze aggiornate.
- Audit for Swift version compatibilità:[ Alcune librerie potrebbero non supportare la versione Swift che il tuo progetto utilizza. Verificare che la filiale o il tag della dipendenza corrispondano alla tua toolchain Swift.
- Rimozione delle dipendenze inutilizzate:[] Rivedere periodicamente il Cartfile o Podfile e rimuovere le librerie che non sono più utilizzate.
- Consider SPM per nuovi progetti:[ Swift Package Manager è ora costruito in Xcode e supportato dalla maggior parte delle biblioteche principali. Se si sta partendo da zero, SPM può essere la scelta più semplice.
Risoluzione dei problemi Problemi comuni
Cacaopoli: “Non trovato”
Questo significa che la biblioteca non è stata spinta al bagagliaio CocoaPods o si sta utilizzando un nome sbagliato. Verificare il nome del pod su [cococoapods.org[]]. Se la libreria è privata, è necessario specificare la sua fonte nel tuo Podfile.
Cacaopoli: Conflitti nelle dipendenze transitive
Eseguire e controllare l'output. È necessario aggiungere vincoli di versione espliciti per i pod transitivi. Utilizzando e un fresco può ripristinare il grafico di dipendenza.
Cartagine: “Nessun modulo” quando si costruisce
Spesso questo accade perché il framework non è stato costruito per la piattaforma corretta (ad esempio, hai costruito con per errore).Ri-run [ e verificare la cartella di uscita. Assicuratevi inoltre di aggiungere il framework alla sezione “Frameworks, Libraries, Embedded Content”, non solo il navigatore di progetto.
Cartagine: La costruzione fallisce a causa delle dipendenze mancanti
Se una libreria che stai usando ha le proprie dipendenze (come le dipendenze RxSwift), è necessario elencarle nel Cartfile. Carthage non scarica automaticamente le dipendenze transitive a meno che non appaiono nel Cartfile o siano specificate come sottomoduli.
Approcci ibridi: utilizzo di CacaoPods e Cartagine
Mentre si raccomanda di mescolare i responsabili della dipendenza in un unico progetto, alcuni team lo fanno di necessità. Ad esempio, una libreria critica potrebbe essere disponibile solo tramite CocoaPods, mentre il resto del progetto utilizza Cartagine. Se si deve combinare, mantenere lo spazio di lavoro CocoaPods separato e collegare i quadri di Cartagine manualmente.
Il futuro della gestione della dipendenza da iOS
Swift Package Manager (SPM) è ora considerato lo standard di Apple ed è integrato direttamente in Xcode 11 e più tardi. La maggior parte delle librerie open source hanno aggiunto il supporto SPM, e SPM elimina la necessità di strumenti esterni. Tuttavia, sia CocoaPods che Carthage hanno ancora vantaggi:
- CocoaPods[[] offre una ricca personalizzazione attraverso ganci e plugin, e il suo repository spec rimane la più grande collezione di librerie iOS.
- Carthage[]] ti dà il pieno controllo sul processo di costruzione ed è più facile da memorizzare, rendendolo popolare nei flussi di lavoro CI-heavy.
Molte squadre utilizzano SPM per nuove dipendenze, mantenendo le integrazioni legacy con CocoaPods o Cartagine. Nel tempo, SPM è previsto per diventare il default, ma per ora, la comprensione di tutti e tre gli strumenti consente di lavorare su qualsiasi codice base iOS.
Conclusioni
CocoaPods offre una soluzione chiavi in mano che automatizza l'intero processo di integrazione, rendendolo ideale per le squadre che vogliono velocità e semplicità. Carthage offre un approccio più leaner e trasparente che dà agli sviluppatori il controllo granulare sui sistemi di costruzione e sulla struttura del progetto.
Per ulteriori informazioni, esplorare le guide ufficiali dei CocoaPods[ e il repository Carthage GitHub.