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: studiodan player, dan perpustakaan bergantung core, graphdan network, di mana dependensi adalah sebagai berikut:
coreadalah standalonegraphtergantung padacore(sub-modul di./libs/core)networkdepdends oncore(sub-module at./libs/core)studiotergantung padagraphdannetwork(sub-modul di./libs/graphdan./libs/network)playertergantung padagraphdannetwork(sub-modul di./libs/graphdan./libs/network)
Misalkan kita menggunakan CMake dan masing-masing proyek ini memiliki unit test dan semua pekerjaan. Setiap proyek (termasuk studiodan 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 coredikloning dua kali dalam studioproyek. Selain dari pemborosan ruang disk ini, saya memiliki masalah sistem pembangunan karena saya membangun coredua 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
graphdannetworkberi 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 kecoresub-modul lokal . - Memperkenalkan ketergantungan ekstra:
studiopadacore. Kemudian,studiobuildcore, atur path include ke salinancoresub-modulnya sendiri, kemudian buildgraphdannetworkdalam 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 graphmungkin juga memerlukan pembaruan coredan networkuntuk mendapatkan versi yang kompatibel coredi semua proyek) .
Ada pemikiran tentang ini?