CocoaPods et fourches GitHub

108

C'est la première fois que je lance un projet GitHub, et je ne suis pas trop compétent avec les CocoaPods non plus, alors veuillez me supporter.

Fondamentalement, j'ai forké un projet sur GitHub en utilisant ce qui suit dans mon Podfile:

pod 'REActivityViewController', '~> 1.6.7', :git => 'https://github.com/<username>/REActivityViewController.git'

J'ai ensuite apporté quelques modifications à la fourche, et bien sûr, lorsque j'ai pod installinstallé un autre pod, il a réinstallé l'original REActivityViewControlleret effacé mes modifications.

Je me rends compte que je dois pousser mes modifications sur mon fork avant un autre pod install, mais comment savoir que c'est le fork en cours d'installation, étant donné qu'il s'agit d'un repo installé par CocoaPods? J'ai regardé dans le REActivityViewControllerdossier installé sous le Podsdossier et il n'y a pas de fichiers git.

Dois-je travailler sur mon fork en dehors de mon projet, puis utiliser CocoaPods pour installer les modifications? C'est un flux de travail trop lourd.

Ou dois-je faire quelque chose avec des sous-modules?

Ramsel
la source

Réponses:

185

Je vais répondre à cette question en utilisant un exemple. J'ai un fork de TTTAttributedLabel avec des fonctionnalités supplémentaires que j'ai ajoutées ici:

https://github.com/getaaron/TTTAttributedLabel

Afin de l'utiliser dans un projet Cocoapods, je:

  1. Pousser mes modifications sur ma fourchette
  2. Configurer mon Podfile pour obtenir les modifications et la mise à jour

Une fois que vous avez poussé vos modifications sur votre fork, obtenez le SHA de votre dernier commit. Vous pouvez le faire en utilisant git rev-parse origin/master | pbcopyou sur la page de validation GitHub de votre projet: Capture d'écran de la copie du SHA d'un commit sur GitHub

Ensuite, vous pouvez spécifier le commit spécifique sur votre fork dans votre Podfile comme ceci:

pod 'TTTAttributedLabel', :git => 'https://github.com/getaaron/TTTAttributedLabel.git', :commit => 'd358791c7f593d6ea7d6f8c2cac2cf8fae582bc1'

Après cela, pod updatemettra à jour ce commit particulier à partir de votre fork. Si vous le souhaitez, vous pouvez également en créer un podspecpour votre fork, mais je trouve cette approche plus simple et je n'apporte pas de modifications assez fréquemment pour justifier un nouveau flux de travail.

Dois-je travailler sur mon fork en dehors de mon projet, puis utiliser Cocoapods pour installer les modifications? C'est une façon trop lourde d'un flux de travail.

Vous pouvez le faire de cette façon, mais je:

  1. Modifiez le code dans mon projet et assurez-vous qu'il fonctionne
  2. Copiez les modifications sur ma fourchette, par
    • exporter un patch, ou
    • copie de l'intégralité du fichier de code source
  3. Valider et pousser vers GitHub
  4. Mettez à jour le Podfile avec le nouveau SHA
  5. Courez pod update.

Ou dois-je faire quelque chose avec des sous-modules?

Non, vous n'en avez pas besoin.

Aaron Brager
la source
Question de suivi: La mise à jour du Podfile avec le nouveau SHA est donc vraiment nécessaire? pod installne clonera pas automatiquement la version la plus récente avec le dernier commit?
Ramsel
Si vous renommez votre projet en quelque chose de différent et créez votre propre fichier podspec, vous pouvez le pointer vers votre propre dépôt et l'utiliser à la pod 'MyForkName', :headplace.
Aaron Brager le
1
:head:pointe vers le dernier commit, mais vous ne pouvez pas utiliser :gitet :headdans la même ligne.
Aaron Brager le
4
C'est une solution parfaite pour utiliser un fork personnalisé d'un projet public. Dans mon cas, j'ai forké et modifié un projet, et j'avais un PR ouvert pour que le responsable fusionne ces changements, mais je voulais mettre à jour le Podfile de mon projet pour utiliser ces changements immédiatement. Cela a très bien fonctionné!
cbowns
2
@AaronBrager indique "Impossible de trouver une spécification pour '<nom du pod>'", savez-vous comment le résoudre?
Susim Samanta
34

Une autre option consiste à demander à votre projet de référencer le pod directement et non via github. De cette façon, vous n'avez pas à continuer à valider votre fork ou à copier / coller du code juste pour tester vos modifications. Vous pouvez travailler avec deux projets Xcode différents simultanément et vous engager séparément dans leurs projets respectifs.

pod 'AFNetworking', :path => '~/Documents/AFNetworking'

Documentation CocoaPods: http://guides.cocoapods.org/using/the-podfile.html#using-the-files-from-a-folder-local-to-the-machine

entrez la description de l'image ici

Oren
la source
1
Comment cela résout-il le problème? Le Pod extrait ces sources et les place en tant que projet Pods dans le projet source. Toutes les modifications apportées à ces fichiers (désormais inclus via les pods) ne sont pas suivies par Git de '~ / Documents / AFNetworking', n'est-ce pas?
Raj Pawan Gumdal