Accélérez la compilation Xcode en contrôlant vos dépendances

Graphe de dépendance du projet RocketSkill iOS

Les développeurs Cocoa et Swift peuvent intégrer des librairies externes beaucoup plus facilement grâce à des gestionnaires de dépendances (CocoaPods, Carthage, Swift Package Manager).

J’y vois plutôt une bonne chose car cela prouve qu’on arrive à externaliser des développements et surtout qu’on ne redéveloppe pas des choses déjà existantes.

Dans l’idéal les librairies sont intégrées par un gestionnaire de dépendances. Ce gestionnaire va gérer les dépendances et les intégrer au projet. Il va s’occuper des dépendances mais aussi les dépendances des dépendances, etc. Vous voyez où je veux en venir ?

Au final, les librairies que l’on rajoute peuvent représenter plus de lignes de code que notre propre projet et impacter grandement la compilation !

La taille ça compte

Pour illustrer je vais prendre le cas de notre application préférée RocketSkill.

Nous utilisons CocoaPods. Nous décrivons les librairies que nous intégrons via le Podfile. Le gestionnaire de dépendances va analyser ce fichier, construire un graphe, s’assurer qu’il existe bien une compatibilité entre toutes les librairies que l’on veut utiliser et si tout se passe bien il va créer un workspace de travail.

Glossaire Cocoapods !

Podfile. le fichier donc lequel nous déclarons les librairies que l’on veut utiliser, leurs versions, leurs sources, etc.

Podspec. Le mode d’emploi de la librairie. C’est un JSON écrit par le développeur. Les Podspec sont centralisés sur un repo git CocoaPods/Specs.

Podspec.dependencies .Cette partie du fichier .podspec référence les dépendances vers d’autres projets.

Podspec.subspecs. Cette partie du fichier .podspec décrit le découpage de la librairie en fonctionnalités. Cela correspond à des options et chacune de ces options peut avoir ses propres dépendances.

Podfile.lock. Ce fichier capture de l’état de l’installation des dépendances. Cela permet de « figer » l’installation et de pouvoir reproduire la même configuration.

Le podfile de RocketSkill !

Une installation RocketSkill, c’est 23 pods de dépendances directes, mais au final c’est plutôt 50 dépendances d’installées. Eh oui, les librairies que l’on intègre ont pas mal de dépendances.

target 'RocketSkill' do
  pod 'THLabel'
  pod 'Alamofire'
  pod 'AlamofireImage'
  pod 'RSLoadingView'
  pod 'PureLayout'
  pod 'MaryPopin'
  pod 'SAConfettiView'
  pod 'lottie-ios'
  pod 'Fabric'
  pod 'Crashlytics'
  pod 'BulletinBoard'
  pod 'Koloda'
  pod 'pop'
  pod 'GTProgressBar'
  pod 'Version'
  pod 'KSToastView'
  pod 'FirebaseAnalytics'
  pod 'FirebaseCore'
  pod 'FirebaseMessaging'
  pod 'FirebaseUI'
  pod 'GoogleAnalytics'
  pod 'FaveButton'
  pod 'Highlightr'
end

On peut consulter le podfile.lock pour comprendre d’où provienne les 27 dépendances. Rapidement FirebaseUI semble le coupable idéal, un sacré parpaing dans l’application.

Ça sentait déjà mauvais pendant la compilation lors de la compilation de Firebase/Firestore qui est tellement longue … et que je n’avais pas intégré moi-même.

A lui seul, FirebaseUI emporte 26 dépendances 😭

    - AppAuth
    - BoringSSL-GRPC
    - FBSDKCoreKit
    - FBSDKLoginKit
    - Firebase
    - FirebaseAuth
    - FirebaseAuthInterop
    - FirebaseCore
    - FirebaseCoreDiagnostics
    - FirebaseCoreDiagnosticsInterop
    - FirebaseDatabase
    - FirebaseFirestore
    - FirebaseStorage
    - FirebaseUI
    - GoogleDataTransport
    - GoogleDataTransportCCTSupport
    - GoogleSignIn
    - GoogleUtilities
    - "gRPC-C++"
    - gRPC-Core
    - GTMAppAuth
    - GTMSessionFetcher
    - leveldb-library
    - nanopb
    - Protobuf
    - SDWebImage

Et c’est là qu’intervient l’importance des subspecs. Firebase a bien découpé ses composants mais nous n’avions pas pris le temps de faire « mon marché. »

PodsNombre de dépendances
de FirebaseUI
Nombre de fichiers
à compiler
Nombre de lignes
à compiler
podfile RocketSkill‘FirebaseUI’26961269 734
podfile RocketSkill
FirebaseUI optimisé
‘FirebaseUI/Email’
‘FirebaseUI/Facebook’
‘FirebaseUI/Google’
‘FirebaseUI/OAuth’
17420118 742
Gains56%56%

Un gain de 60% de temps de compilation !

La configuration du podfile influence directement le temps de compilation en ajoutant des fichiers et des lignes de code à compiler. Un petit contrôle de son podfile peut réduire énormément le temps du processus de « build ».

Temps de compilation
(en secondes)
podfile RocketSkill548
podfile RocketSkill
FirebaseUI optimisé
194

Un gain de 60% de notre temps de compilation … c’est énorme.