CocoaPods und GitHub Gabeln

108

Dies ist mein erstes Mal, dass ich ein GitHub-Projekt forke, und ich bin auch nicht besonders kompetent mit CocoaPods. Bitte nehmen Sie Kontakt mit mir auf.

Grundsätzlich habe ich ein Projekt auf GitHub wie folgt gegabelt Podfile:

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

Ich habe dann einige Änderungen an der Gabel vorgenommen, und natürlich habe ich pod installbeim Installieren eines anderen Pods das Original neu installiert REActivityViewControllerund meine Änderungen gelöscht.

Mir ist klar, dass ich meine Änderungen an meiner Gabel vor einer anderen verschieben muss pod install, aber woher weiß ich, dass die Gabel installiert wird, wenn man bedenkt, dass dies ein von CocoaPods installiertes Repo ist? Ich habe in dem REActivityViewControllerOrdner gesucht, der unter dem Ordner installiert ist, Podsund es gibt keine Git-Dateien.

Muss ich außerhalb meines Projekts an meiner Gabel arbeiten und dann die Änderungen mit CocoaPods installieren? Das ist für einen Workflow zu umständlich.

Oder muss ich etwas mit Submodulen machen?

Ramsel
quelle

Antworten:

185

Ich werde diese Frage anhand eines Beispiels beantworten. Ich habe eine Abzweigung von TTTAttributedLabel mit einigen zusätzlichen Funktionen, die ich hier hinzugefügt habe:

https://github.com/getaaron/TTTAttributedLabel

Um dies in einem Cocoapods-Projekt zu verwenden, habe ich:

  1. Schieben Sie meine Änderungen an meine Gabel
  2. Konfigurieren Sie mein Podfile, um die Änderungen und Aktualisierungen zu erhalten

Sobald Sie Ihre Änderungen an Ihrer Gabelung vorgenommen haben, erhalten Sie die SHA Ihres letzten Commits. Sie können dies mit git rev-parse origin/master | pbcopyoder auf der GitHub-Commit-Seite für Ihr Projekt tun : Screenshot des Kopierens des SHA eines Commits auf GitHub

Anschließend können Sie das spezifische Commit für Ihre Gabel in Ihrem Podfile wie folgt angeben:

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

Danach pod updatewird dieses bestimmte Commit von Ihrem Fork aktualisiert. Wenn Sie möchten, können Sie auch eine podspecfür Ihre Gabel erstellen, aber ich finde diesen Ansatz einfacher und nehme nicht häufig genug Änderungen vor, um einen neuen Workflow zu rechtfertigen.

Muss ich außerhalb meines Projekts an meiner Gabel arbeiten und dann Cocoapods verwenden, um die Änderungen zu installieren? Das ist ein umständlicher Workflow.

Sie können es so machen, aber ich normalerweise:

  1. Bearbeiten Sie den Code in meinem Projekt und stellen Sie sicher, dass er funktioniert
  2. Kopieren Sie die Änderungen auf meine Gabel, von
    • einen Patch exportieren oder
    • Kopieren über die gesamte Quellcodedatei
  3. Commit & Push zu GitHub
  4. Aktualisieren Sie das Podfile mit dem neuen SHA
  5. Ausführen pod update.

Oder muss ich etwas mit Submodulen machen?

Nein, das musst du nicht.

Aaron Brager
quelle
Folgefrage: Eine Aktualisierung des Podfiles mit dem neuen SHA ist also wirklich notwendig? pod installKlonen Sie nicht automatisch die aktuellste Version mit dem neuesten Commit?
Ramsel
Wenn Sie Ihr Projekt in etwas anderes umbenennen und eine eigene Podspec-Datei erstellen, können Sie es auf Ihr eigenes Repo verweisen und pod 'MyForkName', :headstattdessen verwenden.
Aaron Brager
1
:head:zeigt auf das neueste Commit, aber Sie können es nicht verwenden :gitund :headin derselben Zeile.
Aaron Brager
4
Dies ist eine perfekte Lösung für die Verwendung einer benutzerdefinierten Abzweigung eines öffentlichen Projekts. In meinem Fall habe ich ein Projekt gegabelt und geändert und hatte eine offene PR für den Betreuer, um diese Änderungen zusammenzuführen, wollte aber die Poddatei meines Projekts aktualisieren, um diese Änderungen sofort zu verwenden. Das hat super geklappt!
cbowns
2
@AaronBrager zeigt "Es kann keine Spezifikation für '<Podname>' gefunden werden". Wissen Sie, wie Sie das Problem beheben können?
Susim Samanta
34

Eine andere Möglichkeit besteht darin, dass Ihr Projekt direkt auf den Pod verweist und nicht über Github. Auf diese Weise müssen Sie Ihren Fork nicht ständig festschreiben oder Code kopieren / einfügen, um Ihre Änderungen zu testen. Sie können gleichzeitig mit zwei verschiedenen Xcode-Projekten arbeiten und diese separat in ihre jeweiligen Projekte einbinden.

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

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

Geben Sie hier die Bildbeschreibung ein

Oren
quelle
1
Wie löst dies das Problem? Der Pod zieht diese Quellen und platziert sie als Pods-Projekt im Quellprojekt. Änderungen an diesen (jetzt über Pods enthaltenen) Dateien werden von Git im '~ / Documents / AFNetworking' nicht verfolgt, nicht wahr?
Raj Pawan Gumdal