Dans cette deuxième partie sur XcodeGen, nous passons à présenter comment on peut régénérer les xcodeproj de nos frameworks et de notre application principal. Lorsque j’ai travaillé sur ce sujet, j’avais un seul souci, comment je peux automatiser la création de ce pipeline dans one line command ? Je vais vous montrer mon approche 🙂 . Allons y…

  1. Création des frameworks:

Il est nécessaire de créer pour chaque framework son fichier YML spécifique. Imaginons que nous avons une framework Utils qui constitue notre boite à outils fait maison. La structure de fichier YML peut être comme ça:

name: Utils
configs: 
  Debug: debug
  Release: release
  STAGING: release
options:
  bundleIdPrefix: com.WalidSASSI
  defaultConfig: Release
  deploymentTarget: 
    iOS: "11.0"
  groupOrdering: 
    - order: [Utils]
  groupSortPosition: top 
targets:
  Utils:
    type: framework
    platform: iOS
    sources: 
      - path: Utils
    settings:
      configs:
        Debug:
          CODE_SIGN_STYLE: Automatic
          PRODUCT_BUNDLE_IDENTIFIER: com.walidSASSI.app.Utils
          TARGETED_DEVICE_FAMILY: 1
        Release:
          CODE_SIGN_STYLE: Automatic
          PRODUCT_BUNDLE_IDENTIFIER: com.walidSASSI.app.Utils
          TARGETED_DEVICE_FAMILY: 1
        STAGING:
          CODE_SIGN_STYLE: Automatic
          PRODUCT_BUNDLE_IDENTIFIER: com.walidSASSI.app.Utils
          TARGETED_DEVICE_FAMILY: 1

On a 3 configs (Debug, release et staging), le type de la target Utils est framework (par défaut dynamique).

NB. On peut aussi transformer de dynamique vers static le binaire généré de la framework en se basant sur le setting MACH_O_TYPE: staticlib.

Liste exhaustifs des builds settings de Apple depuis la documentation officielle.

2. Gestions des dépendances de la framework:

Pareil à l’application, on peut spécifier les dépendances de notre frameworks vers d’autres frameworks internes ou externes au projet de cette manière:

dependencies:
      - framework: Networking.framework
        implicit: true
        embed: false
      - framework: Common.framework
        implicit: true
        embed: false
      - framework: myFramework.xcframework
        embed: false
      - framework: Utils.framework
        implicit: true
        embed: false

il est obligatoire de ne pas recopier les symboles de ces frameworks dans le binaire final de l’application avec option embed: false et linker vers la référence de la framework de l’application avec l’option explicit: true.

Linkage des frameworks

3. Génération du tout les frameworks et de l’application principal:

Malheureusement xcodeGen n’offre pas jusqu’à maintenant une solution qui permet de générer tout les xcodeproj de notre workspace en une seule commande. c’est pour cela on a pensé à une solution à base de script pour réaliser et voila le script:

folders=(ViewModel Utils Common Networking)
for i in `ls -d ./*/`
do
  for j in "${folders[@]}"
  do
    if [[ "$(basename $i)" == "$j" ]]; then
      cd "$i"
      xcodegen generate
      cd ..
      break
    fi
  done
done
xcodegen generate

le script parcourt le contenu du dossier parent de notre projet et lance xcodegen generate pour chaque dossier relatif au projet de la framework. Après terminer ce traitement, on lancera le xcodegen de l’application principal. En effet, l’ordre est important ici pour ajouter les pods spécifiques à chaque framework à partir du podfile générale de l’application si vous utilisez Cocoapods.

Génération finale des xcodeproj

Conclusion

Si vous êtes dans un projet multi frameworks et vous souhaitez utiliser xcodegen, j’espère que cette article aura à vous aider pour réaliser ce challenge. XcodeGen présente des avantages énormes au niveau de la création propre du projet et surtout la détection des fichiers redondants, qu’on peut parfois ne pas se rendre compte lorsqu’on travaille sur un grand projet avec du legacy code. Mais il est préférable selon plusieurs références iOS de comprendre la structure interne du xcodeproj pour être à l’abri de cet outil malgré ses avantages.

Leave A Comment

Solve : *
42 ⁄ 21 =