CocoaPods dan GitHub fork

108

Ini adalah pertama kalinya saya membuat proyek GitHub, dan saya juga tidak terlalu kompeten dengan CocoaPods, jadi mohon bersabarlah.

Pada dasarnya, saya membuat proyek di GitHub menggunakan yang berikut di saya Podfile:

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

Saya kemudian membuat beberapa perubahan pada fork, dan tentu saja ketika saya pod installmenginstal pod lain, ia menginstal ulang yang asli REActivityViewControllerdan menghapus perubahan saya.

Saya menyadari bahwa saya perlu mendorong perubahan saya ke garpu sebelum yang lain pod install, tetapi bagaimana saya tahu itu adalah garpu yang dipasang, mengingat ini adalah repo yang dipasang oleh CocoaPods? Saya mencari di REActivityViewControllerfolder yang diinstal di bawah Podsfolder dan tidak ada file git.

Apakah saya perlu mengerjakan fork di luar proyek saya dan kemudian menggunakan CocoaPods untuk menginstal perubahan? Itu terlalu rumit dari alur kerja.

Atau apakah saya perlu melakukan sesuatu dengan submodul?

Ramsel
sumber

Jawaban:

185

Saya akan menjawab pertanyaan ini dengan menggunakan sebuah contoh. Saya memiliki cabang dari TTTAttributedLabel dengan beberapa fungsi tambahan yang saya tambahkan di sini:

https://github.com/getaaron/TTTAttributedLabel

Untuk menggunakan ini dalam proyek Cocoapods, saya:

  1. Dorong perubahan saya ke garpu saya
  2. Konfigurasikan Podfile saya untuk mendapatkan perubahan & pembaruan

Setelah Anda menerapkan perubahan ke garpu, dapatkan SHA dari pengubahan terakhir Anda. Anda dapat melakukan ini menggunakan git rev-parse origin/master | pbcopyatau di halaman komit GitHub untuk proyek Anda: Tangkapan layar menyalin SHA komit di GitHub

Kemudian, Anda dapat menentukan komit spesifik pada fork Anda di Podfile seperti ini:

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

Setelah itu, pod updateakan memperbarui komit khusus ini dari garpu Anda. Jika mau, Anda juga dapat membuat podspecfork Anda, tetapi menurut saya pendekatan ini lebih sederhana dan saya tidak cukup sering membuat perubahan untuk membenarkan alur kerja baru.

Apakah saya perlu mengerjakan fork saya di luar proyek saya dan kemudian menggunakan Cocoapods untuk menginstal perubahan? Itu cara untuk alur kerja yang rumit.

Anda dapat melakukannya dengan cara ini, tetapi saya biasanya:

  1. Edit kode di dalam proyek saya dan pastikan berhasil
  2. Salin perubahan ke garpu saya, oleh
    • mengekspor tambalan, atau
    • menyalin seluruh file kode sumber
  3. Berkomitmen & dorong ke GitHub
  4. Perbarui Podfile dengan SHA baru
  5. Lari pod update.

Atau apakah saya perlu melakukan sesuatu dengan submodul?

Tidak, Anda tidak perlu melakukannya.

Aaron Brager
sumber
Pertanyaan tindak lanjut: Jadi memperbarui Podfile dengan SHA baru benar-benar diperlukan? pod installtidak hanya secara otomatis mengkloning versi terbaru dengan commit terbaru?
Ramsel
Jika Anda mengganti nama proyek Anda menjadi sesuatu yang berbeda dan membuat file podspec Anda sendiri, Anda dapat mengarahkannya ke repo Anda sendiri dan menggunakannya pod 'MyForkName', :head.
Aaron Brager
1
:head:menunjuk ke komit terbaru, tetapi Anda tidak dapat menggunakan :gitdan :headdi baris yang sama.
Aaron Brager
4
Ini adalah perbaikan sempurna untuk menggunakan garpu khusus dari proyek publik. Dalam kasus saya, saya bercabang dan memodifikasi sebuah proyek, dan memiliki PR terbuka untuk pengelola untuk menggabungkan perubahan tersebut, tetapi ingin memperbarui Podfile proyek saya untuk segera menggunakan perubahan tersebut. Ini bekerja dengan baik!
cbowns
2
@AaronBrager menampilkan "Tidak dapat menemukan spesifikasi untuk '<pod name>'" apakah Anda tahu cara mengatasinya?
Susim Samanta
34

Opsi lainnya adalah meminta project Anda mereferensikan pod secara langsung dan bukan melalui github. Dengan cara ini Anda tidak perlu terus menggunakan garpu atau menyalin / menempel kode hanya untuk menguji perubahan Anda. Anda dapat bekerja dengan dua proyek Xcode berbeda secara bersamaan dan berkomitmen secara terpisah ke dalam proyek masing-masing.

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

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

masukkan deskripsi gambar di sini

Oren
sumber
1
Bagaimana cara ini mengatasi masalah? Pod akan mengambil sumber-sumber ini dan menempatkannya sebagai proyek Pod dalam proyek sumber. Setiap perubahan pada file ini (sekarang disertakan melalui Pod) tidak dilacak oleh Git dari '~ / Documents / AFNetworking', bukan?
Raj Pawan Gumdal