Penso che ci siano tre elementi chiave che devi capire per quanto riguarda la struttura del progetto: obiettivi , progetti e aree di lavoro . I target specificano in dettaglio come viene costruito un prodotto / binario (ovvero un'applicazione o una libreria). Includono impostazioni di compilazione, come flag di compilatore e linker, e definiscono quali file (codice sorgente e risorse) appartengono effettivamente a un prodotto. Quando costruisci / esegui, selezioni sempre un obiettivo specifico.
È probabile che tu abbia alcuni target che condividono codice e risorse. Questi diversi target possono essere versioni leggermente diverse di un'app (iPad / iPhone, marchi diversi, ...) o casi di test che devono naturalmente accedere agli stessi file di origine dell'app. Tutti questi obiettivi correlati possono essere raggruppati in un progetto . Mentre il progetto contiene i file da tutti i suoi target, ogni target seleziona il proprio sottoinsieme di file rilevanti. Lo stesso vale per le impostazioni di compilazione: puoi definire impostazioni predefinite a livello di progetto nel progetto, ma se uno dei tuoi target richiede impostazioni diverse, puoi sempre sovrascriverli lì:
Impostazioni di progetto condivise ereditate da tutte le destinazioni, a meno che non vengano ignorate
Impostazioni target concrete: PSE iPhone ha la precedenza sulle Base SDK
impostazioni del progetto
In Xcode, si aprono sempre progetti (o aree di lavoro, ma non target) e tutte le destinazioni in esso contenute possono essere costruite / eseguite, ma non esiste alcun modo / definizione di costruzione di un progetto, quindi ogni progetto ha bisogno di almeno una destinazione per essere più di una semplice raccolta di file e impostazioni.
Seleziona uno degli obiettivi del progetto da eseguire
In molti casi, i progetti sono tutto ciò che serve. Se si dispone di una dipendenza creata dall'origine, è possibile incorporarla come sottoprogetto . I sottoprogetti possono essere aperti separatamente o all'interno del loro super progetto.
demoLib è un sottoprogetto
Se aggiungi uno dei target del sottoprogetto alle dipendenze del superprogetto, il sottoprogetto verrà creato automaticamente a meno che non sia rimasto invariato. Il vantaggio qui è che puoi modificare i file sia dal tuo progetto che dalle tue dipendenze nella stessa finestra Xcode, e quando costruisci / esegui, puoi selezionare tra le destinazioni del progetto e dei suoi sottoprogetti:
Se, tuttavia, la tua libreria (il sottoprogetto) viene utilizzata da una varietà di altri progetti (o dai loro obiettivi, per essere precisi), ha senso metterlo allo stesso livello gerarchico: ecco a cosa servono gli spazi di lavoro . Le aree di lavoro contengono e gestiscono i progetti e tutti i progetti che include direttamente (ovvero, non i loro sottoprogetti) sono allo stesso livello e i loro obiettivi possono dipendere l'uno dall'altro (gli obiettivi dei progetti possono dipendere dagli obiettivi dei sottoprogetti, ma non viceversa).
Struttura dell'area di lavoro
In questo esempio, entrambe le app ( AnotherApplication / ProjectStructureExample ) possono fare riferimento alle destinazioni del progetto demoLib . Ciò sarebbe anche possibile includendo il progetto demoLib in entrambi gli altri progetti come sottoprogetto (che è solo un riferimento, quindi non è necessaria alcuna duplicazione), ma se si hanno molte dipendenze incrociate, le aree di lavoro hanno più senso. Se apri un'area di lavoro, puoi scegliere tra le destinazioni di tutti i progetti durante la costruzione / esecuzione.
È ancora possibile aprire i file di progetto separatamente, ma è probabile che i loro obiettivi non vengano creati perché Xcode non è in grado di risolvere le dipendenze se non si apre il file dell'area di lavoro. Le aree di lavoro offrono gli stessi vantaggi dei sottoprogetti: una volta modificata una dipendenza, Xcode la ricostruirà per assicurarsi che sia aggiornata (anche se ho avuto alcuni problemi con ciò, non sembra funzionare in modo affidabile).
Le tue domande in breve :
1) I progetti contengono file (codice / risorse), impostazioni e destinazioni che creano prodotti da tali file e impostazioni. Le aree di lavoro contengono progetti che possono fare riferimento a vicenda.
2) Entrambi sono responsabili della strutturazione del progetto complessivo, ma a diversi livelli.
3) Penso che i progetti siano sufficienti nella maggior parte dei casi. Non utilizzare aree di lavoro a meno che non ci sia un motivo specifico. Inoltre, puoi sempre incorporare il tuo progetto in un'area di lavoro in un secondo momento.
4) Penso che sia per questo che il testo sopra è per ...
C'è un'osservazione per 3): CocoaPods , che gestisce automaticamente le librerie di terze parti, utilizza gli spazi di lavoro. Pertanto, devi usarli anche quando usi CocoaPods
(cosa che fanno molte persone).