2009-11-04 8 views
7

Ho una struttura personalizzata che, seguendo i consigli nella Guida alla programmazione Framework Apple >>Installing your framework I installa in/Library/Frameworks. Faccio questo con l'aggiunta di uno script eseguito costruisco fase con il seguente script:Il modo migliore per installare una struttura di cacao personalizzata

cp -R build/Debug/MyFramework.framework /Library/Frameworks 

Nei miei progetti ho poi Link contro/Library/Frameworks/MyFramework e importarlo nei miei corsi in questo modo:

#import <MyFramework/MyFramework.h> 

Questo funziona molto bene, solo che vedo sempre il seguente messaggio nella mia console debugger:

programma Caricamento in debugger ... SharedLibrary applicare-load-governa tutto Avviso: Impossibile leggere i simboli per "/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework" (file non trovato). Avviso : Impossibile leggere i simboli da "MyFramework" (non ancora mappato in memoria). Programma caricato.

A quanto pare, il compilatore cerca prima in/Users/elisevanlooij/Library/Frameworks, non riesce a trovare MyFramework, poi guarda in/Library/Frameworks, non trovare MyFramework e continua per la sua strada. Finora questo è stato più un fastidio che un vero problema, ma quando si eseguono test delle unità, gdb si ferma sul (file non trovato) e si rifiuta di continuare. Ho risolto il problema con l'aggiunta di una riga in più per la fase di esecuzione script

cp -R build/Debug/MyFramework.framework ~/Library/Frameworks 

ma ci si sente come qualcosa sello-taping che non deve essere rotto in primo luogo. Come posso risolvere questo?

risposta

11

Negli ultimi mesi, ho imparato molto di più sui framework, quindi sto riscrivendo questa risposta. Si noti che sto parlando di che installa un framework come parte del workflow di sviluppo.

Il percorso preferito per l'installazione di un framework pubblico (ovvero un framework che verrà utilizzato da più di una delle app o bundle) è/Library/Frameworks [testo del collegamento] perché "i framework in questa posizione vengono rilevati automaticamente dal compilatore in fase di compilazione e il linker dinamico in fase di esecuzione. "[Guida alla programmazione di framework]. Il modo più elegante per farlo è nella sezione Distribuzione delle impostazioni di Build.

Come si lavora sul quadro, ci sono momenti in cui si vuole aggiornare il quadro quando si esegue una generazione, e momenti in cui non lo fai. Per questo motivo, modifico le impostazioni di distribuzione solo nella configurazione di rilascio. Quindi:

  1. doppio clic sul bersaglio quadro per aprire la finestra di informazioni di destinazione e passare alla scheda Genera.
  2. Selezionare Rilascia nella casella di selezione Configurazione.
  3. Scorrere fino alla sezione Distribuzione e immettere i seguenti valori:

Posizione di distribuzione = YES (Seleziona la casella)

Installazione realizzare prodotti Posizione =/

directory di installazione =/Libreria/Framework

L'installazione Crea posizione di prodotto funge da root dell'installazione. Il suo valore di default è una directory/tmp: se non si cambia alla radice del sistema, non vedrai mai il framework installato dal momento che è nascosto nella/tmp.

Ora puoi lavorare sul tuo framework come preferisci nella configurazione di Debug senza sconvolgere gli altri tuoi progetti e quando sei pronto per pubblicare tutto ciò che devi fare è passare a Release e fare una Build.

Xcode 4 Attenzione Dal momento che il passaggio a Xcode 4, ho sperimentato un certo numero di problemi con la mia quadro personalizzato. Per lo più, sono link avvertimenti in GDB che in realtà non interferiscono con l'utilità del quadro, ad eccezione di quando si esegue l'unità-test incorporato. Ho inviato un ticket di assistenza tecnica ad Apple una settimana fa, e ci stanno ancora esaminando. Quando ricevo una soluzione di lavoro Voglio aggiornare questa risposta in quanto la questione si è dimostrato molto popolare (1 kViews e il conteggio).

+0

Dovresti considerare tutte le risposte di cdespinosa relative al sistema di compilazione Xcode per essere autorevoli. – NSResponder

+1

Bene, ho votato la sua risposta, quindi spero che le mie rotte siano al sicuro. Ma considero la soluzione in cui sono arrivato più elegante, poiché comporta meno modifiche alle impostazioni Xcode predefinite ed elimina la necessità della riga di comando. –

0

Naturalmente, quando si distribuisce il framework deve essere installato in/Library/Frameworks; tuttavia mi sembra strano che tu lo stia facendo con le versioni test/debug del tuo framework.

Il mio primo istinto sarebbe installare le versioni di test in ~/Library, poiché semplifica molto la configurazione dell'ambiente di test e di debug. Se possibile, mi aspetto che il framework di debug/test si trovi nella struttura di build della versione che sto testando, nel qual caso è installato come Private Framework a scopo di test. Ciò renderà la tua vita molto più semplice quando arriverà il momento di gestire più versioni del tuo framework.

In definitiva, non importa dove si trova il framework finché l'applicazione o la suite di test caricano la versione corretta. Scegli la posizione che rende più facile test/debug/sviluppo.

+0

Poiché il framework è utilizzato da diversi progetti, l'installazione come framework privato non è fattibile. Ho provato la stessa cosa con la versione di rilascio (cp -R build/Release/MyFramework.framework/Library/Frameworks) ma il risultato è lo stesso. Per quanto riguarda non importa dove si trova il quadro finchè ... - beh, le parole mi tradiscono. –

3

Non ci sono molti motivi per mettere un framework in Library/Frameworks, ed è molto lavoro: avresti bisogno di farlo per l'utente in un pacchetto di installazione, che è una seccatura enorme da creare e mantenere, o avere il codice di installazione nella tua app (che può essere installato solo in ~/L/F, a meno che tu non spenda il tempo e gli sforzi necessari per rendere la tua app capace di installare in/L/F con i poteri di root).

Molto più comune è what Apple calls a “private framework”. Lo impacchetterai nel tuo pacchetto di applicazioni.

Anche i framework destinati a un uso generico da qualsiasi applicazione (ad esempio, Sparkle, Growl) sono, in pratica, costruiti per essere utilizzati come framework privati, semplicemente perché il modo "giusto" di installare una singola copia del framework su Library/Frameworks è una tale seccatura.

+0

Non dubito che la creazione di un pacchetto di installazione sia molto impegnativa, non l'ho mai fatto e non è qualcosa che non vedo l'ora. Ma dal momento che dovrà essere fatto comunque per le app, non vedo che aggiungere un altro per il framework sarebbe un grosso problema - probabilmente dovrebbe essere incluso negli installer dell'app, a meno che non si riveli un quadro insolitamente popolare. Tutto sommato, non sono convinto che mantenere il framework privato sia così importante. –

+0

Non sono d'accordo. È davvero facile copiare il pacchetto .framework in/Library/Frameworks e quindi importarlo in altri progetti Xcode. –

+0

@RaffiKhatchadourian: Ma la tua applicazione non funzionerà per nessun altro. Devi installare il framework (s) in L/F sulla macchina di ogni utente; l'app non verrà avviata per tutti gli utenti che non dispongono dei framework nella stessa posizione in cui li hai avuti. –

3

Il modo convenzionale per fare ciò è avere il progetto di framework ei suoi client condividono una directory di compilazione comune. Xcode cercherà le intestazioni framework e collegherà i file binari del framework nella cartella build prima, prima di qualsiasi altra posizione. Quindi un progetto di app che compila e collega l'intestazione riprenderà quello più recente, piuttosto che quello installato.

È quindi possibile rimuovere cp -r e utilizzare invece l'impostazione di installazione Percorso di installazione per posizionare il prodotto di costruzione nella posizione finale, utilizzando xcodebuild install DSTROOT =/nella riga di comando. Ma hai solo bisogno di farlo quando hai finito, non tutte le volte che ricostruisci il framework.

+0

Intrigante, ma ho trovato due problemi con questo approccio. Prima di tutto, installare xcodebuild DSTROOT =/cura il problema "Impossibile leggere i simboli". Tuttavia: 1) Quando la directory di costruzione per il framework è stata puntata alla directory di compilazione comune (all'esterno della cartella del progetto), xcodebuild in qualche modo trascurerebbe le modifiche apportate nel framework. La data di modifica dei file di intestazione del framework cambierebbe, ma non il contenuto di hte (forse a che fare con il controllo delle versioni?). 2) Quando ho cambiato la directory di costruzione di default, xcodebuild installava nel framework un'altra copia del framework. Strano. –