Git alt modüllerinin büyük bir hayranıyım . Sürümüyle birlikte bir bağımlılığı izleyebilmeyi severim, böylece projenizin önceki bir sürümüne geri dönebilir ve bağımlılığın ilgili sürümünü güvenli ve temiz bir şekilde oluşturabilirsiniz. Dahası, kütüphanelerimizin tarihi, onlara bağlı olan uygulamalardan (ve açık kaynaklı olmayacak) farklı olduğundan, açık kaynak projeleri olarak yayınlanması daha kolaydır.
İşyerinde çoklu projeler için iş akışı kuruyorum ve bu yaklaşımı tek bir monolitik projeye değil, biraz aşırıya çekersek bunun nasıl olacağını merak ediyordum. Çabucak fark ettim ki, gerçekten de alt modülleri kullanmanın olası bir solucan kutusu var .
: Uygulamaların bir çift farz studiove playerve bağımlı kütüphaneleri core, graphve networkaşağıdaki gibi bağımlılıklar vardır:
corebağımsızgraphbağlıdırcore(alt modül de./libs/core)networkbağlıdırcore(alt modül de./libs/core)studiobağlıdırgraphvenetwork(en alt modüllere./libs/graphve./libs/network)playerbağlıdırgraphvenetwork(en alt modüllere./libs/graphve./libs/network)
CMake'i kullandığımızı ve bu projelerin her birinin birim testleri ve tüm çalışmaları olduğunu varsayalım . Her proje (dahil studiove dahil player) kod ölçümleri, birim testleri vb. İşlemleri yapmak için bağımsız olarak derlenebilmelidir.
Mesele şu ki, özyinelemeli git submodule fetch, sonra aşağıdaki dizin yapısını elde edersiniz:
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/
Projede coreiki kez klonlandığına dikkat edin studio. Bu boşa harcanan disk alanı dışında, bir derleme sistemi sorunum var çünkü coreiki kez yapıyorum ve potansiyel olarak iki farklı sürümü alıyorum core.
Soru
Alt modülleri nasıl düzenlerim ki ortak iç içe alt modüllerin birden fazla kopyasını almadan sürüm bağımlılığı ve bağımsız yapı elde edeyim?
Olası çözüm
Kütüphane bağımlılığı bir öneriden kaynaklanıyorsa (yani, "X sürümüyle çalıştığı biliniyor" veya "yalnızca X sürümü resmi olarak desteklenir") ve olası bağımlı uygulamalar veya kütüphaneler, istedikleri sürümle oluşturulmasından sorumludur, o zaman Aşağıdaki senaryoyu hayal edebiliyorum:
- Derleme sistemini nerelere bulacağınızı
graphvenetworknerede bulacağınızı söyleyincore(örneğin, bir derleyici yoluyla yol dahil). "Bağımsız" ve "bağımlılık" olmak üzere "bağımsız" ve "bağımlılık" olmak üzere iki yapı hedefi tanımlayın; burada "bağımsız", "bağımlılık" ı temel alır ve yerelcorealt modüle işaret etmek için içerme yolunu ekler . - Ekstra bir bağımlılık tanıtın:
studioaçıkcore. Ardından,studioderlercore, içerme yolunucorealt modülün kendi kopyasına ayarlar , sonra derlergraphvenetwork"bağımlılık" modunda ayarlar.
Ortaya çıkan klasör yapısı gibi görünüyor:
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)
Bununla birlikte, bu, bir miktar inşa sistemi sihri gerektirir (bunun CMake ile yapılabileceğinden oldukça eminim) ve sürüm güncellemelerinin bir kısmı el ile çalışmayı graphgerektirir (güncelleme ayrıca tüm projelerin güncellenmesini coreve networkuyumlu bir sürümünü edinmek için gerekli olabilir core) .
Bunun hakkında bir düşüncen var mı?