Comment garder vos fichiers localisables iOS propres - Swift script edition

Il y a quelques mois, j'ai exploré les possibilités d'amélioration de Xcode en ce qui concerne la maintenance propre de vos fichiers de chaîne localisables. Pour réitérer le problème, les fichiers de chaîne localisables ont tendance à devenir disproportionnés et à devenir négligents assez rapidement, en particulier lorsque les ingénieurs ont activé leur application pour différentes langues. Garder ces fichiers propres et maintenables devient difficile. Les problèmes majeurs rencontrés avec les fichiers localisables sont: l'illisibilité, les duplications de clés, des clés incompatibles dans différents fichiers de chaîne, des clés manquantes mais utilisées dans le code et des clés supplémentaires non utilisées dans le code (j'appelle ces clés mortes).

La solution proposée précédemment consistait à injecter un script bash après la compilation afin de vous aider à contrôler vos fichiers de chaîne localisables avec votre base de code (Nettoyer les fichiers localisables iOS). Le script triait les clés, recherchait les clés dupliquées et incompatibles, et localisait les clés indéfinies et / ou mortes dans vos fichiers localisables. La solution était viable et atténuait les problèmes courants, mais il y avait quelques problèmes avec le script lui-même dont je n'étais pas tellement satisfait.

  • L'exécution du script était extrêmement lente! Surtout quand le projet est devenu plus gros - O (n2) solution. La solution visait à créer un point de départ pour résoudre un problème sans prendre en compte l'optimisation.
  • Le bash est difficile à lire - cela peut ne pas être le cas pour certaines personnes, mais en tant qu’ingénieur de Swift / Obj-C, la relecture du script bash a nécessité des mises à jour. Dans cet esprit, les modifications du script que les autres ingénieurs iOS pouvaient utiliser pour leurs propres projets étaient plus pénibles que bénéfiques.
  • Le chaînage de plusieurs commandes grep n’était pas une solution optimisée par rapport au hachage et aux ensembles de cache.

En guise de suivi, j'ai décidé de réadapter la solution en tenant compte de ces éléments. J’ai choisi Swift ift, ce qui permet à d’autres ingénieurs iOS de modifier plus facilement le script en fonction des besoins de leurs projets. L'utilisation de Swift m'a également permis d'adopter une approche structurée pour une stratégie plus optimisée.

Si vous souhaitez aller de l'avant et consulter l'intégralité du script, voici l'essentiel. Si vous souhaitez consulter un exemple de projet contenant le script injecté, j'ai inclus le projet GitHub au bas de cet article. sinon, analysons la partie intéressante du script!

Semblable au script bash, nous commençons par rechercher les fichiers de chaîne localisés de manière récursive à partir du répertoire racine en créant (). FileManager d’Apple facilite la recherche de fichiers en énumérant les objets. Notez que nous ignorons tous les fichiers localisés des pods dans notre var localisableFichiers calculés car ceux-ci sont généralement empaquetés. Nous allons optimiser le script ici en recherchant les duplications de clés pendant l'analyse des fichiers localisables dans la méthode parse (_ path: String) et le magasin. les clés dans un ensemble. La méthode imprimera une erreur pour toute duplication de clé avec les chemins de fichiers trouvés.

(Remarque: tout format d'impression ("erreur:") ou d'impression ("avertissement:") indique à Xcode d'afficher le message correspondant dans la barre d'outils, ainsi que d'autres échecs de construction et avertissements.)

Ensuite, nous validerons que les clés correspondent à tous les fichiers de chaîne localisables de la méthode validateMatchKeys. Nous utiliserons symmetricDifference pour créer toutes les clés supplémentaires qui ne correspondent pas aux fichiers de base. Cette méthode génère une erreur et annule le script si des fichiers localisables ne contiennent pas les mêmes clés. Cela vous donne une chance de nettoyer les fichiers localisables avant la prochaine exécution, cleanWrite (), qui réécrit votre fichier localisable avec les clés triées et les espaces supplémentaires et les nouvelles lignes supprimés.

L'étape suivante consiste à rechercher dans la base de code, à stocker les clés utilisées dans ces fichiers et à les vérifier par rapport à nos clés de base. Avec un peu de regex, nous pouvons localiser avec succès les clés et les stocker ainsi que le chemin du fichier dans une structure LocalizationCodeFile tout en optimisant notre script en compactant tous les fichiers sans clé. Une fois que nous aurons notre structure, nous atteindrons validateMissingKeys () - qui parcourra notre collection de LocalizationCodeFile, en soustrayant chaque ensemble de clés par rapport à nos clés de base. Les clés supplémentaires de ce résultat ne sont PAS des sous-ensembles de nos clés de base - nous donnant ainsi nos clés manquantes. Une erreur est générée si des clés manquantes sont trouvées.

Notre dernière stratégie consiste à rechercher des clés mortes, des clés définies dans nos fichiers localisables mais non utilisées dans notre base de code. Nous pouvons récupérer nos clés mortes en soustrayant nos clés de base de toutes les clés collectées dans notre collection de LocalizationCodeFile par le biais d'une flatMap. Toutes les clés trouvées ici sont affichées à titre d'avertissement, car cette étape est davantage un nettoyage de dette technique suggéré plutôt qu'un problème affectant l'utilisateur.

Exécuter le script bash sur une base de code d’entreprise avec plus de 600 fichiers exécutables et environ 800 clés a pris une moyenne lourde de 81 secondes. L'exécution de ce script rapide sur le même code a pris une moyenne rapide de 3 secondes!

Garder une base de code propre et lisible devrait être l'objectif de tous les ingénieurs. Avec ce script Swift injecté dans votre post-build, le nettoyage et la maintenance de vos fichiers localisables devraient vous aider à atteindre cet objectif et vous donner l'impression d'être automatisés. Vous pouvez lire mon précédent blog pour savoir comment injecter le script dans votre compilation post-compilation Xcode (https://buildingvts.com/clean-ios-localizable-files-8b910413b985).

J’ai également inclus un projet GitHub avec l’ensemble du script et le projet exemple ici: https://github.com/ginowu7/CleanSwiftLocalizableExample. N'hésitez pas à laisser des commentaires ou des suggestions et vous pouvez me suivre sur Twitter @ ginowu07! Bonne codage!