Il y a 1 mois -

Temps de lecture 3 minutes

Pépite #14 – Les script phases de Cocoapods

Depuis la version 1.4.0, CocoaPods nous permet de définir des script phases directement depuis notre Podfile.

Dans cette pépite nous allons voir brièvement comment les utiliser avec deux outils populaires que sont SwiftLint et SwiftGen, et comment pousser leur utilisation un peu plus loin.

SwiftLint

target :myApp do
  pod SwiftLint
  pod ...

  script_phase {
    :name => '🚨 SwiftLint',
    :script => '"${PODS_ROOT}/SwiftLint/swiftlint"',
    :execution_position => :before_compile
  }
end

La script phase pour SwiftLint est la plus simple qui puisse être créée : on définit un script « 🚨 SwiftLint » qui sera executé avant la compilation de notre code.

A l’éxécution, le binaire « swiftlint » situé dans le répertoire des pods (PODS_ROOT) est appelé. Et c’est tout. Aucune dépendance pour l’exécution, ce script sera ré-exécuté à chaque fois que l’on lancera la compilation de notre code.

Faites attention à bien échapper les variables d’environnement dans la commande que vous exécutez en utilisant des guillements double comme dans l’exemple.

SwiftGen

target :myApp do
  pod SwiftGen
  pod ...

  swiftgen {
    :name => '🛠️ Generate resources',
    :script => '"${PODS_ROOT}/SwiftGen/bin/swiftgen" config run --config .swiftgen.yml && touch .swiftgen.yml"',
    :execution_position => :before_compile,
    :input_files => ['.swiftgen.yml'],
    :output_files => ['Generated/Assets.generated.swift', 'Generated/Fonts.generated.swift']
  }

Le principe est le même que pour SwiftLint, mais nous avons ajouté deux paramètres supplémentaires :
input_files, qui permet de définir les fichiers dont l’exécution de la commande dépend ;
output_files, qui définit les fichiers générés par la commande (obligatoire depuis Xcode10).

A partir de CocoaPods 1.7.0, vous pouvez aussi utiliser {input/output}_file_lists pour passer des xcfilelist en entrée/sortie.

Going deeper

Ici l’idée est d’aller un cran plus loin et de définir nos script phases dans un fichier séparé, que nous allons appeler Phasesfile.

Phasesfile
module Phase
  def self.swiftlint
    {
      :name => '🚨 SwiftLint',
      :script => '"${PODS_ROOT}/SwiftLint/swiftlint"',
      :execution_position => :before_compile
    }
  end

  def self.resources
    {
      :name => '🛠️ Generate resources',
      :script => Script.swiftgen,
      :execution_position => :before_compile,
      :input_files => ['.swiftgen.yml'],
      :output_file_lists => ['.swiftgen.outputs.xcfilelist']
    }
  end
end

module Script
  def self.swiftgen
    <<~EOS
      "${PODS_ROOT}/SwiftGen/bin/swiftgen" config run --config .swiftgen.yml
      touch .swiftgen.yml
    EOS
  end
end 

Il nous suffit ensuite de les invoquer dans notre Podfile :

load 'Phasesfile'

target :myApp do
  script_phase(Phase.swiftlint)
  script_phase(Phase.resources)

  pod SwiftLint
  pod SwiftGen
  pod ...
end

Deux avantages à cette approche :

1. Notre fichier Podfile reste de taille raisonnable

2. Il est facile de porter nos phases dans un autre projet en copiant le fichier Phasesfile, ou en l’important via un Github Gist par exemple.

 

Vous savez maintenant tout sur les script phases de CocoaPods qui sont un ajout intéressant, et qui permettront un jour de ne plus avoir à versionner son .xcodeproj !

 

Publié par Jean-Christophe Pastant

Jean-Christophe est consultant iOS et partage régulièrement ses bonnes pratiques avec la communauté iOS.

Commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.