Je fais du développement iOS depuis quelques mois maintenant et viens d’apprendre que la bibliothèque prometteuse CocoaPods pour la gestion des dépendances.
Je l'ai essayé sur un projet personnel: j'ai ajouté une dépendance à Kiwi à mon fichier Podfile, lancé pod install CocoaPodsTest.xcodeproj
et voila, cela a très bien fonctionné.
La seule chose que je me demande est la suivante: que dois-je archiver et que dois-je ignorer pour le contrôle de version? Il semble évident que je veuille vérifier le fichier podfile lui-même et probablement aussi le fichier .xcworkspace; mais est-ce que j'ignore le répertoire Pods /? Y a-t-il d'autres fichiers qui seront générés ultérieurement (lorsque j'ajoute d'autres dépendances) que je devrais également ajouter à mon fichier .gitignore?
Personnellement, je ne vérifie pas le répertoire et le contenu des pods. Je ne peux pas dire que j'ai passé beaucoup de temps à considérer les implications, mais mon raisonnement ressemble à quelque chose comme:
Le fichier podfile fait référence à une balise spécifique ou à une validation de chaque dépendance afin que les pods eux-mêmes puissent être générés à partir du fichier podfile, car ils ressemblent davantage à un produit de construction intermédiaire qu'à une source et ne nécessitent donc pas de contrôle de version dans mon projet.
Je commets mon répertoire Pods. Je ne suis pas d'accord pour dire que le répertoire Pods est un artefact de construction. En fait, je dirais que ce n'est certainement pas le cas. Cela fait partie de la source de votre application: elle ne se construira pas sans elle!
Il est plus facile de considérer CocoaPods comme un outil de développement plutôt que comme un outil de construction. Il ne construit pas votre projet, il clone simplement et installe vos dépendances à votre place. Il ne devrait pas être nécessaire d’installer CocoaPods pour pouvoir simplement construire votre projet.
En faisant de CocoaPods une dépendance de votre build, vous devez maintenant vous assurer qu'il est disponible partout où vous en aurez besoin pour construire votre projet ... un administrateur d'équipe en a besoin, votre serveur de CI en a besoin. En règle générale, vous devriez toujours pouvoir cloner votre référentiel source et le construire sans aucun effort supplémentaire.
Ne pas valider votre répertoire Pods crée également un énorme mal de tête si vous changez souvent de branche. Maintenant, vous devez exécuter l'installation du pod à chaque changement de branche pour vous assurer que vos dépendances sont correctes. Cela peut être moins fastidieux à mesure que vos dépendances se stabilisent, mais au début d'un projet, il s'agit d'une perte de temps considérable.
Alors, qu'est-ce que j'ignore? Rien. Podfile, le fichier de verrouillage et le répertoire Pods sont tous validés. Croyez-moi, cela vous évitera beaucoup de tracas. Quels sont les inconvénients? Un repo légèrement plus grand? Pas la fin du monde.
Je recommande d’utiliser le gitHub de Objective-C gitignore . En détail, les meilleures pratiques sont:
Podfile
doit toujours être sous contrôle de source.Podfile.lock
doit toujours être sous contrôle de source.:path
devrait être conservé sous contrôle de source../Pods
peut être conservé sous contrôle de source.Pour plus d'informations, vous pouvez vous référer au guide officiel .
source: je suis membre de l’équipe principale de CocoaPods, comme @alloy
Bien que le dossier Pods soit un artefact de construction, vous pouvez prendre en considération certaines raisons avant de décider de le garder sous contrôle de source:
:head
et :git
n’utilisent pas actuellement les validations stockées dans Podfile.lock
).Je travaille généralement sur les applications des clients. Dans ce cas, j’ajoute également le répertoire Pods au référentiel, afin de garantir qu’à tout moment un développeur puisse effectuer une extraction, créer et exécuter.
Si c’était une application de notre choix, j’exclurais probablement le répertoire Pods jusqu’à ce que je n’y travaille plus pendant un moment.
En fait, je dois en conclure que je ne suis peut-être pas la meilleure personne pour répondre à votre question, par opposition aux points de vue des utilisateurs purs :) Je tweeterai sur cette question depuis https://Twitter.com/CocoaPodsOrg .
Pas de réponse en fait offre un .gitignore
, voici donc deux variantes.
Vérification dans le répertoire Pods ( Avantages )
Compatible avec Xcode/iOS, ignorer, ignorer les fichiers système Mac OS, Xcode, les versions, les autres référentiels et les sauvegardes.
.gitignore:
# Mac OS X Finder
.DS_Store
# Private Keys
*.pem
# Xcode legacy
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
# Xcode
xcuserdata/
project.xcworkspace/
DerivedData/
# build products
build/
*.[oa]
# repositories
.hg
.svn
CVS
# automatic backup files
*~.nib
*.swp
*~
*(Autosaved).rtfd/
Backup[ ]of[ ]*.pages/
Backup[ ]of[ ]*.key/
Backup[ ]of[ ]*.numbers/
Ignorer le répertoire Pods ( Avantages )
.gitignore: _ (ajouter à la liste précédente)} _
# Cocoapods
Pods/
Que vous vérifiiez ou non le répertoire Pods, les fichiers Podfile et Podfile.lock doivent toujours être conservés sous contrôle de version.
Si Pods
ne sont pas archivés, votre Podfile
devrait probablement demander des numéros de version explicites pour chaque Cocoapod. Cocoapods.org discussion ici .
Je vérifie tout. (Pods/
et Podfile.lock
.)
Je veux pouvoir cloner le référentiel et savoir que tout fonctionnera comme avant la dernière fois que j'ai utilisé l'application.
Je préférerais vendre des objets plutôt que de risquer d'avoir des résultats différents qui pourraient être causés par une version différente de la gemme, ou par quelqu'un qui réécrit l'historique dans le référentiel du Pod, etc.
La réponse à cela est donnée directement dans la documentation de Cocoapod. Vous pouvez consulter " http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control "
Que vous vérifiiez ou non dans votre dossier Pods dépend de vous, comme les flux de travail varient d'un projet à l'autre. Nous vous recommandons de conserver le Répertoire Pods sous contrôle de code source, et ne l'ajoutez pas à votre fichier .gitignore. Mais en fin de compte, cette décision vous appartient:
Avantages de l'enregistrement dans le répertoire Pods
- Après le clonage du référentiel, le projet peut immédiatement construire et s'exécuter, même sans avoir CocoaPods installé sur la machine. Il n'y a pas Vous devez exécuter l’installation du pod et aucune connexion Internet n’est nécessaire.
- Les artefacts de pod (code/bibliothèques) sont toujours disponibles, même si la source d’un pod (par exemple, GitHub) devait s’éteindre.
- Les artefacts de pod sont garantis identiques à ceux de l'installation d'origine après le clonage du référentiel.
Avantages d'ignorer le répertoire Pods
Le référentiel de contrôle de source sera plus petit et prendra moins de place.
Tant que les sources (par exemple, GitHub) de tous les pods sont disponibles, CocoaPods est généralement capable de recréer la même installation . (Techniquement, rien ne garantit que l'installation du pod en cours va récupérer Et recréer des artefacts identiques lorsque vous n'utilisez pas un commit SHA dans le Podfile. Cela est particulièrement vrai lorsque vous utilisez des fichiers Zip dans le Podfile.)
Il n'y aura pas de conflits à gérer lors de l'exécution d'opérations de contrôle de source, telles que la fusion de branches avec différents pod versions.
Que vous vérifiiez ou non le répertoire Pods, le fichier Podfile et le fichier Podfile.lock doit toujours être conservé sous contrôle de version.
Je suis dans le camp des développeurs qui ne vérifient pas les bibliothèques, en supposant que nous en ayons un bon exemplaire disponible ailleurs. Ainsi, dans mon .gitignore, j'inclus les lignes suivantes spécifiques à CocoaPods:
Pods/
#Podfile.lock # changed my mind on Podfile.lock
Ensuite, je m'assure que nous avons un exemplaire des bibliothèques dans un endroit sûr. Plutôt que d'utiliser (incorrectement) le référentiel de code d'un projet pour stocker des dépendances (compilées ou non), je pense que le meilleur moyen de le faire est d'archiver les générations. Si vous utilisez un serveur de CI pour vos générations (telle que Jenkins), vous pouvez archiver de manière permanente toutes les générations qui sont importantes pour vous. Si vous effectuez toutes vos versions de production dans votre Xcode local, prenez l’habitude de créer une archive de votre projet pour toutes les versions que vous souhaitez conserver. Quelque chose comme: 1. Produit -> Archive
Distribuer ... Soumettre vers iOS App Store/Enregistrer pour l'entreprise ou Déploiement ad-hoc/et encore
Révéler votre dossier de projet dans le Finder
Faites un clic droit et compressez "WhateverProject"
Cela fournit une image as-build de l'ensemble du projet, y compris l'ensemble des paramètres de projet et d'espace de travail utilisés pour créer l'application, ainsi que des distributions binaires (telles que Sparkle, des kits de développement propriétaires tels que TestFlight, etc.) qu'ils utilisent ou non CocoaPod.
Mise à jour: J'ai changé d'avis à ce sujet et engage maintenant le Podfile.lock
dans le contrôle de code source. Cependant, je continue de croire que les pods eux-mêmes sont des artefacts de construction et qu'ils doivent être gérés comme tels en dehors du contrôle des sources, via une autre méthode, telle que votre serveur CI ou un processus d'archivage tel que décrit ci-dessus.
Je préfère valider le répertoire Pods
avec Podfile
et Podfile.lock
pour m'assurer que tous les membres de mon équipe puissent vérifier la source à tout moment et qu'ils n'ont pas à s'inquiéter de rien ni à faire des opérations supplémentaires pour que cela fonctionne.
Cela aide également dans un scénario où vous avez corrigé un bogue dans l'un des pods ou modifié certains comportements selon vos besoins, mais ces modifications ne seront pas disponibles sur d'autres machines si elles ne sont pas validées.
Et pour ignorer les répertoires inutiles:
xcuserdata/
Je dois dire que je suis un partisan de la création de pods dans le référentiel. En suivant un lien déjà mentionné, vous obtiendrez un bon fichier .gitignore pour obtenir vos projets Xcode pour iOS afin de permettre les pods, mais également pour vous permettre de les exclure facilement si vous le souhaitez: https://github.com/github/ gitignore/blob/master/Objective-C.gitignore
Si je suis un fan d’ajout de pods au référentiel, c’est pour une raison fondamentale que personne ne semble comprendre, que se passe-t-il si une bibliothèque dont notre projet est si dépendant s’est soudainement retirée du Web?
NB ... veuillez noter que la branche 'master' pour le développement est juste pour des exemples, bien évidemment, les branches 'master' dans les systèmes de contrôle de version, doivent être maintenues propres et peuvent être déployées/construites à tout moment}
À partir de cela, je pense que les instantanés dans vos référentiels de code sont certainement meilleurs que d'être stricts sur la taille du référentiel. Et comme déjà mentionné, le fichier podfile.lock - sous contrôle de version, vous donnera un bon historique des versions de votre pod.
En fin de compte, si les délais, le budget et le budget sont serrés, il est primordial - nous devons faire preuve de la plus grande ingéniosité possible et ne pas perdre de temps sur des idéologies strictes, mais plutôt exploiter un ensemble d’outils pour travailler ensemble. - rendre nos vies plus faciles plus efficaces.
À la fin, c’est à vous de choisir votre approche.
Voici ce qu'en pense l'équipe de Cocoapods:
Que vous vérifiiez ou non dans votre dossier Pods dépend de vous, comme les flux de travail varient d'un projet à l'autre. Nous vous recommandons de conserver le Répertoire Pods sous contrôle de code source, et ne l'ajoutez pas à votre fichier .gitignore. Mais finalement, cette décision est à vous.
Personnellement, j'aimerais garder Pods, comme node_modules si j’utilisais Node ou bower_components si j’utilisais Bower. Ceci s’applique à presque tous les gestionnaires de dépendances et constitue la philosophie de git submodules aswell.
Cependant, il peut arriver que vous souhaitiez être vraiment sûr du state-of-art de certaines dépendances, de cette façon, vous êtes responsable de la dépendance dans votre projet. Bien sûr, vous rencontrez plusieurs inconvénients, mais les préoccupations ne concernent pas uniquement les Cocoapods, elles s’appliquent à tous les gestionnaires de dépendances.
Vous trouverez ci-dessous une bonne liste de avantages/inconvénients établie par l’équipe de Cocoapods, ainsi que le texte intégral de la citation mentionnée précédemment.
Équipe Cocoapods: Devrais-je vérifier le répertoire Pods dans le contrôle de source?
Cela dépend, personnellement:
pods.xcodeproj
font également partie du contrôle de source. Cela signifie par exemple Si vous avez le projet dans Swift 4
, mais que certains pods doivent l'être dans Swift 3.2
car ils ne sont pas encore mis à jour, ces paramètres seront enregistrés. Sinon, celui qui clonait le référentiel se retrouverait avec des erreurs.pod install
, l'inverse ne peut pas être effectué.Quelques inconvénients: référentiel plus grand, diffs déroutants (principalement pour les membres de l’équipe), potentiellement plus de conflits.
Pour moi, la plus grande préoccupation est de sécuriser votre source à l’avenir. Si vous envisagez de faire durer votre projet pendant un certain temps et que CocoaPods disparaisse un jour ou que la source de l'un des pods disparaisse, vous ne pouvez absolument pas tenter votre chance si vous essayez de créer de nouvelles archives.
Cela pourrait être atténué par des archives périodiques complètes.
Vérifiez dans les pods.
Je pense que cela devrait être un principe de développement logiciel
Pourquoi?
CocoaPods ou toute autre bibliothèque externe peut changer, ce qui pourrait casser des choses. Ils peuvent aussi être déplacés, renommés ou supprimés. Vous ne pouvez pas compter sur Internet pour stocker des choses pour vous. Votre ordinateur portable est peut-être mort et un bogue critique de la production doit être corrigé. Le développeur principal pourrait être heurté par un bus et son remplaçant doit démarrer rapidement. Et j'aimerais que ce dernier soit un exemple théorique, mais c'est ce qui s'est passé lors d'un démarrage avec lequel j'étais. DÉCHIRURE.
De manière réaliste, vous ne pouvez pas vraiment vérifier TOUTES les dépendances. Vous ne pouvez pas enregistrer une image de la machine que vous avez utilisée pour créer des versions; vous ne pouvez pas vérifier la version exacte du compilateur. Etc. Il y a des limites réalistes. Mais enregistrez tout ce que vous pouvez - ne pas le faire vous rend la vie plus difficile. Et nous ne voulons pas ça.
Mot final: Les pods ne sont pas des artefacts de construction. Les artefacts de génération sont générés à partir de vos versions. Votre construction utilise des pods, pas les générer. Je ne sais même pas pourquoi cela doit être débattu.
Que vous vérifiiez ou non votre dossier Pods vous appartient, car les flux de travail varient d'un projet à l'autre. Nous vous recommandons de conserver le répertoire Pods sous contrôle de source et de ne pas l'ajouter à votre .gitignore. Mais en fin de compte, cette décision vous appartient:
Avantages de la vérification dans le répertoire Pods
Avantages d'ignorer le répertoire Pods
En théorie, vous devriez vérifier dans le répertoire Pods. En pratique, ça ne va pas toujours marcher. De nombreux pods dépassent bien la taille limite des fichiers github, donc si vous utilisez github, vous aurez des problèmes pour vérifier le répertoire Pods.
Il semble qu'un bon moyen de structurer cela serait de faire du répertoire "Pods" un sous-module git/projet séparé, voici pourquoi.
Avoir des pods dans votre référentiel de projet, lorsque vous travaillez avec plusieurs développeurs, peut entraîner de très grandes différences dans les demandes d'extraction où il est presque impossible de voir le travail réel qui a été modifié par des personnes (pensez à plusieurs centaines à des milliers de fichiers modifiés pour les bibliothèques et seulement peu ont changé dans le projet actuel).
Je vois le problème de ne rien commettre à cracher, car le propriétaire de la bibliothèque pourrait le supprimer à tout moment et que vous êtes essentiellement SOL, cela résout également ce problème.
Avantages de pas archiver Pods/
dans le contrôle de version (par ordre d'importance subjectif):
pod install
pourrait masquer les modifications.Podfile
et Pods/
sont plus rapides parmi les coéquipiers. Si vous archivez Pods/
et, par exemple, mettez à jour une version dans Podfile
, mais oubliez d'exécuter pod install
ou archivez les modifications apportées à Pods/
, vous aurez beaucoup plus de mal à remarquer la source de la différence. Si Pods/
n'est pas archivé, vous devez toujours exécuter pod install
de toute façon.JAR
, .venv/
(environnements virtuels) et node_modules/
ne sont jamais inclus dans le contrôle de version. Si nous étions complètement agnostiques à propos de la question, pas archiver Pods
serait la valeur par défaut basée sur précédent.Inconvénients de pas archiver le Pods/
pod install
lors du changement de branche ou de l'annulation des validations.pod install
.pod install
et la source des pods doit être disponible.En résumé, non compris le répertoire Pods
est un garde-fou contre d'autres mauvaises pratiques. Inclus le répertoire Pods
facilite l'exécution du projet. Je préfère le premier au second. Vous n’avez pas besoin de faire un compte rendu à chaque nouvelle personne participant à un projet sur «que faire {pas» »_ s'il n’est pas possible de faire certaines erreurs au départ. J'aime aussi l’idée d’avoir un contrôle de version séparé pour Pods
qui atténue les inconvénients.