Sto usando Xcode 6 Beta 6.
Questo è qualcosa che mi infastidisce da un po 'di tempo ormai, ma sta raggiungendo un punto in cui è appena utilizzabile ora.
Il mio progetto sta iniziando ad avere una dimensione decente di 65 file Swift e alcuni file Objective-C con bridge (che in realtà non sono la causa del problema).
Sembra che qualsiasi lieve modifica a qualsiasi file Swift (come l'aggiunta di un semplice spazio bianco in una classe che è appena usata nell'app) causerà la ricompilazione di tutti i file Swift per la destinazione specificata.
Dopo un'indagine più approfondita, ho scoperto che ciò che richiede quasi il 100% del tempo del compilatore è la CompileSwift
fase in cui Xcode esegue il swiftc
comando su tutti i file Swift del tuo target.
Ho fatto qualche ulteriore indagine e se mantengo l'app delegata solo con un controller predefinito, la compilazione è molto veloce, ma mentre aggiungevo sempre più file dei miei progetti, il tempo di compilazione stava iniziando a rallentare molto.
Ora con solo 65 file sorgente, ci vogliono circa 8/10 secondi per compilare ogni volta. Non molto veloce .
Non ho visto nessun post parlare di questo problema tranne questo , ma era una vecchia versione di Xcode 6. Quindi mi chiedo se sono l'unico in quel caso.
AGGIORNARE
Ho controllato alcuni progetti Swift su GitHub come Alamofire , Euler e CryptoSwift , ma nessuno di essi aveva abbastanza file Swift per poterlo confrontare. L'unico progetto che ho scoperto che stava iniziando con una dimensione decente era SwiftHN , e anche se aveva solo una dozzina di file sorgente, ero ancora in grado di verificare la stessa cosa, uno spazio semplice e l'intero progetto necessitava di ricompilazione che stava iniziando a prendere un poco tempo (2/3 secondi).
Rispetto al codice Objective-C in cui sia l'analizzatore che la compilation sono velocissimi, sembra davvero che Swift non sarà mai in grado di gestire grandi progetti, ma per favore dimmi che sbaglio.
AGGIORNAMENTO Con Xcode 6 Beta 7
Ancora nessun miglioramento. Questo sta iniziando a diventare ridicolo. Con la mancanza di #import
in Swift, non vedo davvero come Apple sarà mai in grado di ottimizzarlo.
AGGIORNAMENTO Con Xcode 6.3 e Swift 1.2
Apple ha aggiunto build incrementali (e molte altre ottimizzazioni del compilatore). Devi migrare il tuo codice su Swift 1.2 per vedere quei vantaggi, ma Apple ha aggiunto uno strumento in Xcode 6.3 per aiutarti a farlo:
PERÒ
Non rallegrarti troppo velocemente come ho fatto io. Il risolutore di grafici che usano per rendere la build incrementale non è ancora molto ottimizzato.
In effetti, per prima cosa, non esamina le modifiche alla firma della funzione, quindi se aggiungi uno spazio nel blocco di un metodo, tutti i file che dipendono da quella classe verranno ricompilati.
In secondo luogo, sembra creare l'albero in base ai file che sono stati ricompilati anche se una modifica non li influenza. Ad esempio, se si spostano queste tre classi in file diversi
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Ora, se si modifica FileA
, il compilatore segnerà ovviamente FileA
per essere ricompilato. Si ricompilerà anche FileB
(sarebbe OK in base alle modifiche a FileA
), ma anche FileC
perché FileB
è ricompilato, e questo è piuttosto male perché FileC
non lo usa mai FileA
qui.
Quindi spero che migliorino quel solutore di alberi delle dipendenze ... Ho aperto un radar con questo codice di esempio.
AGGIORNAMENTO Con Xcode 7 beta 5 e Swift 2.0
Ieri Apple ha rilasciato la beta 5 e all'interno delle note di rilascio abbiamo potuto vedere:
Swift Language & Compiler • Build incrementali: la modifica del solo corpo di una funzione non dovrebbe più comportare la ricostruzione di file dipendenti. (15352929)
Ci ho provato e devo dire che ora funziona davvero (davvero!) Bene. Hanno ottimizzato notevolmente le build incrementali in tempi rapidi.
Consiglio vivamente di creare una swift2.0
filiale e mantenere aggiornato il codice utilizzando XCode 7 beta 5. Sarai soddisfatto dei miglioramenti del compilatore (tuttavia direi che lo stato globale di XCode 7 è ancora lento e difettoso)
AGGIORNAMENTO Con Xcode 8.2
È passato un po 'di tempo dal mio ultimo aggiornamento su questo problema, quindi eccolo qui.
La nostra app ora ha circa 20k righe di codice quasi esclusivamente Swift, che è decente ma non eccezionale. Ha subito la migrazione rapida 2 e quindi rapida 3. Ci vogliono circa 5 / 6m per compilare su un Macbook pro metà 2014 (Intel Core i7 a 2,5 GHz) che va bene su una build pulita.
Tuttavia, la build incrementale è ancora uno scherzo nonostante Apple affermi che:
Xcode non ricostruirà un intero target quando si sono verificate solo piccole modifiche. (28892475)
Ovviamente penso che molti di noi abbiano riso dopo aver verificato questa assurdità (l'aggiunta di una proprietà privata (privata!) A qualsiasi file del mio progetto ricompilerà il tutto ...)
Vorrei indicarvi ragazzi su questo thread sui forum degli sviluppatori di Apple che contiene alcune informazioni in più sul problema (oltre ad apprezzare le comunicazioni degli sviluppatori Apple sull'argomento di tanto in tanto)
Fondamentalmente le persone hanno escogitato alcune cose per cercare di migliorare la build incrementale:
- Aggiungi un'impostazione di
HEADER_MAP_USES_VFS
progetto impostata sutrue
- Disabilita
Find implicit dependencies
dal tuo schema - Crea un nuovo progetto e sposta la gerarchia dei tuoi file su quello nuovo.
Proverò la soluzione 3 ma la soluzione 1/2 non ha funzionato per noi.
La cosa ironicamente divertente in tutta questa situazione è che guardando il primo post su questo problema stavamo usando Xcode 6 con credo codice swift 1 o swift 1.1 quando abbiamo raggiunto la lentezza delle prime compilation e ora circa due anni dopo, nonostante i reali miglioramenti di Apple, la situazione è tanto grave quanto lo era con Xcode 6. Che ironia.
In realtà mi pento davvero di aver scelto Swift su Obj / C per il nostro progetto a causa della frustrazione quotidiana che comporta. (Passo anche ad AppCode ma questa è un'altra storia)
Ad ogni modo vedo che questo post SO ha 32k + visualizzazioni e 143 up al momento della stesura di questo, quindi credo di non essere l'unico. Resisti ragazzi nonostante sia pessimista per questa situazione, potrebbe esserci un po 'di luce alla fine del tunnel.
Se hai il tempo (e il coraggio!) Immagino che Apple sia contenta del radar su questo.
Alla prossima! Saluti
AGGIORNAMENTO Con Xcode 9
Ci si imbatte in questo oggi. Xcode ha introdotto silenziosamente un nuovo sistema di compilazione per migliorare le orribili prestazioni attuali. Devi abilitarlo attraverso le impostazioni dell'area di lavoro.
Ho ancora provato ma aggiornerà questo post dopo averlo fatto. Sembra promettente però.