XcodeGen est un outil qui permet de générer la structure d’un projet iOS sous Xcode en se basant sur un fichier .yml nommé par défaut project.yml.

XcodeGen

Le projet est maintenu en open source sur GitHub: Lien

L’avantage majeur de XcodeGen provient du fait que le développeur n’aura pas a pousser (push) sur Git le fichier .pbxproj vu que XcodeGen s’occupe de la génération de la structure de projet comme décrit ci-dessus. Ceci éliminera la gestion difficile des conflits lors de merge ou des rebase et simplifiera le GitFlow.

1.  Installation et utilisation : 

Il faut installer tout d’abord XcodeGen sur la machine du développeur : 

brew install xcodegen

ensuite, lorsque vous créez votre branche ou vous avez fait un pull depuis votre répertoire distant:

xcodegen generate

Remarque:

Il est nécessaire d’ajouter le fichier .xcodeProj au niveau du .gitignore de votre projet afin qu’aucun développeur de l’équipe ne peut modifier votre .pbxproj suite à un changement (ajout, suppression d’un nouveau fichier, une nouvelle config (schémas, capabilities….)

Commment construire votre fichier project.yml?

Lorsque vous lancez votre commande xcodegen generate, XcodeGen cherche un fichier spéciale project.yml

Le fichier project.yml n’est qu’une copie plus structurée du .pbxproj dans lequel on définit les targets, les schémas de chaque target, les scripts à lancer, les configurations de compilation (version de swift, le configs de build et ceux de production).

Il est divisé en deux grandes parties:

  • La gestion générale du projet (spécification des configs, règles de tri, exclure des dossiers et des fichiers…)
  • La gestion des targets du projets

Tout changement de config doit être fait dans ce fichier seulement.

2. Gestion générale du projet:

2.1 Définition des configs: 

Le projet contient plusieurs schemas qui peuvent s’exécuter soit en mode debug ou en release.

Debug: debug
Staging: release
Prod: release

2.2 Gestion des modes de lancement:

Imaginons que notre projet contient trois targets: la target principal : App, NotificationService ( la target de gestion des notifications ) et la target des tests AppTests.

Pour chaque schémas, on a 3 targets et 6 modes de lancement : Build, Run, Test, Profile, Analyse, et Archive. Pour chaque mode, il faut définir l’une des configs de compilation décrites ci-dessus (Debug , STAGING ou PROD.) 

Par exemple, si on veut afficher l’archive Organizer après la compilation en mode Archive:

archive:
  config: Release
  customArchiveName: App
  revealArchiveInOrganizer: true

Pour relier la target de tests avec la target principal, on doit ajouter dans le mode Test:

test:
  config: Debug
  gatherCoverageData: true
  coverageTargets:
    - App
  targets: 
    - AppTests

et dans la catégorie Targets:

scheme:
  testTargets:
    - AppTests

3. Gestion des Targets:

3.1  Gestion des scripts:

La target principal App exécute des scripts avant et après la compilation des fichiers sources .swift ou .h du projet:

Alors il est important de distinguer entre ces deux types de scripts:

preBuildScripts:
   - name: "SwiftGen"
     path: scripts/swiftGen.sh
postBuildScripts:
   - name: "Copy GoogleService-Info.plist"
     path: scripts/googleService.sh
   - name: "Copy Google Tag Manager"
     path: scripts/googleTagManager.sh
   - name: "Crashlytics"
     path: scripts/crashlytics.sh
   - name: "Swiftlint lint"
     path: scripts/swiftLint.sh

PS: Tous les scripts sont organisés dans le projet sous le dossier scripts.

3.2 Les types des targets:

Dans la catégorie Targets et sous par exemple App, on définit la nature de la target par exemple 

AppOfCards:
 type: application
 platform: iOS
AppNotificationService:
 type: app-extension
 platform: iOS

3.3 Code Sign In, product Name, Header bridge:

Pour chaque target, et dans chaque config du projet, on doit définir certaines propriétés comme 

le Code Sign In Style, la version de swift, le bridge header si ça existe, le bundle identifier, le product Name…

Debug:
   CODE_SIGN_IDENTITY: iPhone Developer
   PRODUCT_BUNDLE_IDENTIFIER: walidsassi.app.dev
   CODE_SIGN_STYLE: Manual
   SWIFT_VERSION: "5.0"
   SWIFT_OBJC_BRIDGING_HEADER: App/Application/App-Bridging-Header.h
   PRODUCT_MODULE_NAME: App
   PRODUCT_NAME: App

Conclusion

L’utilisation de XcodeGen est intéressante et permet une maitrise de la configuration de projet et réduit les changement à un seul fichier .yml compréhensible si on le compare au .pbxproj. Dans ce tutoriel débutant, nous avons présenté les bases de l’utilisation de cet outil et nous prévoyons un autre tutoriel sur le un projet multi-workspace avec des astuces et des problématiques que nous avons pu résoudre…

fr_FRFrench