Saya penggemar berat sub-modul Git . Saya ingin dapat melacak dependensi bersama dengan versinya, sehingga Anda dapat memutar kembali ke versi sebelumnya dari proyek Anda dan memiliki versi dependensi yang sesuai untuk dibangun dengan aman dan bersih. Selain itu, lebih mudah untuk merilis perpustakaan kami sebagai proyek sumber terbuka karena sejarah untuk perpustakaan terpisah dari aplikasi yang bergantung padanya (dan yang tidak akan bersumber terbuka).
Saya sedang menyiapkan alur kerja untuk beberapa proyek di tempat kerja, dan saya bertanya-tanya bagaimana jadinya jika kita mengambil pendekatan ini sedikit ekstrem daripada memiliki proyek monolitik tunggal. Saya segera menyadari ada potensi cacing dalam benar - benar menggunakan sub-modul.
Misalkan sepasang aplikasi: studio
dan player
, dan perpustakaan bergantung core
, graph
dan network
, di mana dependensi adalah sebagai berikut:
core
adalah standalonegraph
tergantung padacore
(sub-modul di./libs/core
)network
depdends oncore
(sub-module at./libs/core
)studio
tergantung padagraph
dannetwork
(sub-modul di./libs/graph
dan./libs/network
)player
tergantung padagraph
dannetwork
(sub-modul di./libs/graph
dan./libs/network
)
Misalkan kita menggunakan CMake dan masing-masing proyek ini memiliki unit test dan semua pekerjaan. Setiap proyek (termasuk studio
dan player
) harus dapat dikompilasi mandiri untuk melakukan metrik kode, pengujian unit, dll.
Masalahnya adalah, rekursif git submodule fetch
, maka Anda mendapatkan struktur direktori berikut:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
Perhatikan bahwa core
dikloning dua kali dalam studio
proyek. Selain dari pemborosan ruang disk ini, saya memiliki masalah sistem pembangunan karena saya membangun core
dua kali dan saya berpotensi mendapatkan dua versi yang berbeda core
.
Pertanyaan
Bagaimana saya mengatur sub-modul sehingga saya mendapatkan dependensi versi dan pembuatan mandiri tanpa mendapatkan banyak salinan sub-modul bersarang yang umum?
Solusi yang mungkin
Jika ketergantungan perpustakaan agak dari saran (yaitu dalam mode "diketahui bekerja dengan versi X" atau "hanya versi X yang didukung secara resmi") dan aplikasi atau perpustakaan yang bergantung pada potensial bertanggung jawab untuk membangun dengan versi apa pun yang mereka sukai, maka Saya bisa membayangkan skenario berikut:
- Siapkan sistem build untuk
graph
dannetwork
beri tahu mereka di mana menemukannyacore
(mis. Via path compiler include). Tetapkan dua target build, "standalone" dan "dependency", di mana "standalone" didasarkan pada "dependency" dan tambahkan path include untuk menunjuk kecore
sub-modul lokal . - Memperkenalkan ketergantungan ekstra:
studio
padacore
. Kemudian,studio
buildcore
, atur path include ke salinancore
sub-modulnya sendiri, kemudian buildgraph
dannetwork
dalam mode "dependensi".
Struktur folder yang dihasilkan terlihat seperti:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
Namun, ini memerlukan beberapa keajaiban sistem bangun (saya cukup yakin ini dapat dilakukan dengan CMake) dan sedikit pekerjaan manual pada bagian pembaruan versi (pembaruan graph
mungkin juga memerlukan pembaruan core
dan network
untuk mendapatkan versi yang kompatibel core
di semua proyek) .
Ada pemikiran tentang ini?