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 studio
ve player
ve bağımlı kütüphaneleri core
, graph
ve network
aşağıdaki gibi bağımlılıklar vardır:
core
bağımsızgraph
bağlıdırcore
(alt modül de./libs/core
)network
bağlıdırcore
(alt modül de./libs/core
)studio
bağlıdırgraph
venetwork
(en alt modüllere./libs/graph
ve./libs/network
)player
bağlıdırgraph
venetwork
(en alt modüllere./libs/graph
ve./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 studio
ve 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 core
iki kez klonlandığına dikkat edin studio
. Bu boşa harcanan disk alanı dışında, bir derleme sistemi sorunum var çünkü core
iki 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ı
graph
venetwork
nerede 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 yerelcore
alt modüle işaret etmek için içerme yolunu ekler . - Ekstra bir bağımlılık tanıtın:
studio
açıkcore
. Ardından,studio
derlercore
, içerme yolunucore
alt modülün kendi kopyasına ayarlar , sonra derlergraph
venetwork
"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ı graph
gerektirir (güncelleme ayrıca tüm projelerin güncellenmesini core
ve network
uyumlu bir sürümünü edinmek için gerekli olabilir core
) .
Bunun hakkında bir düşüncen var mı?