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.
[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
!
Commentaire