Projeler yapıyoruz, ancak projeler arasında çok fazla kod kullanıyoruz ve ortak kodumuzu içeren çok sayıda kütüphanemiz var. Yeni projeler uygularken, ortak kodu ortadan kaldırmanın ve kütüphanelere koymanın daha fazla yolunu buluyoruz. Kütüphaneler birbirine, projeler kütüphanelere bağlıdır. Her projenin ve bu projede kullanılan tüm kütüphanelerin, atıfta bulundukları tüm kütüphanelerin aynı sürümünü kullanmaları gerekir. Bir yazılım parçası yayınlarsak, hataları düzeltmemiz ve belki de yıllarca, bazen on yıllarca yeni özellikler eklememiz gerekir. Yaklaşık bir düzine kütüphanemiz var, değişiklikler genellikle ikiden fazla kesiliyor ve birkaç ekip paralel olarak birkaç proje üzerinde çalışıyor ve tüm bu kütüphanelerde eşzamanlı değişiklikler yapıyor.
Son zamanlarda git'e geçtik ve her kütüphane ve her proje için depolar kurduk. Stash'ı ortak bir depo olarak kullanırız, özellik dallarında yeni şeyler yaparız, sonra çekme istekleri yaparız ve bunları yalnızca incelemeden sonra birleştiririz.
Projelerde ele almak zorunda olduğumuz sorunların çoğu, çeşitli kütüphanelerde ve projenin özel kodunda değişiklikler yapmamızı gerektirir. Bunlar genellikle bazıları uyumsuz olan kütüphane arayüzlerinde yapılan değişiklikleri içerir. (Bunun kulağa hoş geldiğini düşünüyorsanız: Donanımla arayüz oluştururuz ve genel arayüzlerin arkasındaki belirli donanımları gizleriz. Hemen hemen başka bir satıcının donanımını her birleştirdiğimizde, mevcut arayüzlerimizin öngörmediği ve bunları düzeltmek zorunda kaldık. örnek bir proje hayal P1
kütüphaneleri kullanılarak L1
, L2
ve L3
. L1
Ayrıca kullandığı L2
ve L3
ve L2
kullanımları L3
da. Bağımlılık grafiği şöyle görünür:
<-------L1<--+
P1 <----+ ^ |
<-+ | | |
| +--L2 |
| ^ |
| | |
+-----L3---+
Şimdi bu proje için bir özellik değişikliği gerektiren P1
ve L3
hangi arayüzü değiştirmek düşünün L3
. Şimdi bu kütüphanelere atıfta bulunan projeleri P2
ve P3
karışıma ekleyin . Hepsini yeni arayüze geçirmeyi, tüm testleri çalıştırmayı ve yeni yazılımı dağıtmayı göze alamayız. Peki alternatifi nedir?
- yeni arayüzü
L3
- bir talepte
L3
bulunun ve inceleme için bekleyin - değişikliği birleştir
- yeni bir sürüm oluştur
L3
- yeni sürümüne
P1
başvurarak özellik üzerinde çalışmaya başlayınL3
, ardından özelliğiP1
özellik dalında uygulayın - bir istekte bulunun, bunu inceleyin ve birleştirin
(Sadece yeni sürüme geçmeyi L1
ve L2
yeni sürüme geçmeyi unuttuğumu fark ettim . Ve bunu nereye yapıştıracağımı bile bilmiyorum, çünkü paralel olarak yapılması gerekecek P1
...)
Bu, bu özelliği uygulamak için sıkıcı, hataya eğilimli ve çok uzun bir süreçtir, bağımsız incelemeler gerektirir (bu da incelemeyi çok zorlaştırır), hiç ölçeklenmez ve muhtemelen bizi işten çıkarır çünkü süreç içinde bu kadar bataklık olsun asla hiçbir şey yapmıyoruz.
Ancak, çok fazla ek yük olmadan yeni projelerde yeni özellikler uygulamamıza izin veren bir süreç oluşturmak için dallanma ve etiketlemeyi nasıl kullanıyoruz?