2012-03-14 15 views
30

Sto scrivendo una libreria statica che ha dipendenze da altre librerie (nel mio caso SBJSON e ASIHTTPRequest).Best practice per le dipendenze della libreria statica

Se compilo queste dipendenze esterne nella mia libreria, allora non posso collegarmi ad altre librerie che hanno compilato queste classi. Il mio obiettivo è creare un set di librerie statiche per la mia azienda che possono essere importate in qualsiasi nuova app, la compilazione di queste dipendenze nella libreria non è ovviamente un'opzione.

Qualcuno ha qualche consiglio/best practice per creare una suite di librerie statiche condivise con dipendenze comuni?

+0

Perché non utilizzare Dinamyc biblioteca, invece? – LuisEspinoza

+0

ok, che non è supportato – LuisEspinoza

+3

(A) Questo è abbastanza utile a questa domanda - il mio problema è quello di evitare i simboli duplicatore linker. E i simboli SBJSON? (B) Non lo fanno. Hanno solo un'opinione a riguardo. (C) ASI è una libreria abbastanza usata e testata nel mondo reale - il mio codice è quasi sicuramente più buggato. Anche la risposta accettata dalla domanda a cui ti colleghi ha dei bug! – deanWombourne

risposta

9

Si potrebbe utilizzare un gestore di dipendenza come CocoaPods o VendorKit per tirare nella libreria richiesta, così come tutto ciò che è dipendenze transitive - biblioteche che la biblioteca dipende.

È compito del gestore delle dipendenze gestire tutti i conflitti nelle dipendenze transitive. Ad esempio, se due librerie utilizzano entrambe versioni diverse di SBJSON, risolverà il problema. Tutto quello che devi fare è dichiarare la libreria di livello superiore che desideri in un file di configurazione e risolvere le sottocartelle necessarie e inserirle nel tuo progetto Xcode.

CocaoPods ha un bel modo di gestirlo estraendo tutte le librerie come sorgente e quindi compilandoli tutti in un'unica libreria statica - in un progetto separato. Questo è quindi collegato al tuo progetto tramite uno spazio di lavoro.

VendorKit ha un approccio simile, ma utilizza un singolo file di progetto.

Sia CocoaPods che VendorKit consentono di pubblicare facilmente la libreria in un repository centrale. CocaoPods ti consente di mantenere il tuo fork privato o pubblico del repository centrale, se lo desideri, cioè come un repository aziendale.

Il più delle volte questo ti farà uscire dai guai. In rari casi la tua libreria potrebbe dipendere da una versione molto specifica e precedente di un'altra libreria comune. In questo caso è possibile utilizzare uno strumento per rinominare tutti i file header/impl in quella libreria per evitare collisioni.

[Modifica]: A partire da gennaio 2013 è disponibile anche un nuovo concorrente: il plug-in Maven Xcode.

13

Una libreria statica è solo una raccolta di file oggetto. Nel tuo caso non vuoi che i file oggetto per SBJSON e ASIHTTPRequest siano inclusi nella tua libreria statica: vuoi lasciare quel lavoro all'applicazione finale. L'unica cosa di cui la tua libreria statica ha bisogno sono i file di intestazione per SBJSON e ASIHTTPRequest.

Poiché questi progetti sono entrambi distribuiti come file di origine (file .h e .m), è sufficiente indicare a Xcode di non creare i file .mb SBJSON/ASIHTTPRequest per la destinazione della libreria statica.

Il modo più semplice per eseguire questa operazione è importare i file di intestazione .h per questi progetti nel progetto Xcode. In alternativa puoi importare entrambi i file .h e .m ma assicurati che.file m non sono inclusi nelle "Fonti di compilazione" costruire fase del vostro target libreria statica

Alcuni altri importanti argomenti SO:

How can I avoid "duplicate symbol" errors in xcode with shared static libraries?

Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project

+0

Ma cosa succede se la mia lib statica usa la versione precedente di sbjson - 3.0.4, e il nuovo progetto usa 3.1? ha gli stessi file m ma diversi file h, oppure uno usa ARC e uno no ??? –

+0

Questa soluzione molto semplice e adatta dovrebbe essere la risposta accettata. Grazie Ben per avermi risparmiato ulteriori mal di testa con questo problema! – thgc

Problemi correlati