Il y a 4 ans -

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

[ruby]target :myApp do
pod SwiftLint
pod …

script_phase {
:name => ‘🚨 SwiftLint’,
:script => ‘"${PODS_ROOT}/SwiftLint/swiftlint"’,
:execution_position => :before_compile
}
end[/ruby]

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

[ruby]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’]
}[/ruby]

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

[ruby]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 [/ruby]

Il nous suffit ensuite de les invoquer dans notre Podfile :

[ruby]load ‘Phasesfile’

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

pod SwiftLint
pod SwiftGen
pod …
end[/ruby]

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 e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Sapient, 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.