C / C ++ projesi için bağımlılıkları düzgün bir şekilde nasıl yönetebilirim?


11

Ben 3-4 farklı açık kaynak C / C ++ kütüphaneleri kullanan bir proje var.

Bu kütüphaneleri birkaç platform için oluşturdum ve projemdeki farklı platformlar için dosyaları ve statik kütüphaneleri dahil ettim.

Ancak, birkaç sorunla mücadele ediyorum. Bu projelerin tümü bağımlılık yönetimiyle ilgilidir. Ve ben en iyi uygulamalar tavsiye arıyorum.

1) Tam olarak ne kullandığımı nasıl bilebilirim?

Statik bir lib sürümü elde etmenin bir yolu yok. Sonuç olarak, bir şekilde hangi statik lib sürümünü kullandığımı izlemek gerekir (hangi inşa bir taahhüt SHA olabilir)?

Bu özellikle bu kütüphaneleri ne zaman yükselteceğimi anlamaya ihtiyacım olduğunda önemlidir.

2) Yapıyı nasıl yeniden üretirim?

Belirli bir platform için belirli bir kütüphane oluşturmakta zorlanabilirdim. Anlamak biraz zaman aldı.

Bir dahaki sefere aynı kütüphaneyi inşa etmem gerektiğinde yarım yıl içinde olabilirim (herhangi bir nedenle yükseltmem gerektiğinde. Ancak, o zamana kadar, hiçbir şey ve üzerine inşa edildiği bir ortamı kesinlikle hatırlamayacağım. çoktan gitmiş olacak.

3) Kaynak kodun bir kopyasını almak için bu kütüphaneleri çatallamam gerekir mi?

Bu daha az endişe vericidir. Ancak, hala bir endişe. Yapıların tekrar üretilebilir olduğundan emin olmak güzel (ve bu tür bir kaynak kodu gerektirir).

Yanıtlar:


5

Gerçekten her zaman bağımlı bir kütüphanenin tam sürümünü kullanmanız gerekiyor mu? Kötü yazılmış mı / sürümdeki her küçük artışla API'sını bozuyor mu?

Açık kaynaklı projelere bakarsanız, derleme ( configureçoğunlukla) komut dosyaları çeşitli kitaplıkların mevcut olup olmadığını kontrol eder ve yoksa hata atar. Ayrıca, kullanıcının kütüphanenin daha yeni bir sürümüne (muhtemelen daha eski olandan daha fazla hata / güvenlik düzeltmesi sağlar) bağlanmasına izin verecek kadar esnektir ve ayrıca statik veya dinamik bağlantıyı zorlamaz.

Gerçekten yeniden üretilebilir yapılara ihtiyacınız varsa, derleyicinin tam sürümüne ve bunun standart kütüphanelerine, hatta işletim sistemine de dikkat etmelisiniz. Bu durumda, tam olarak ihtiyacınız olan ortama sahip bir yapı makinesine sahip olmak, bence, kaynak kod deposundaki derlenmiş kitaplıkları kontrol etmekten daha iyidir.


2
Tam sürümü kullanmam gerektiğini düşünmüyorum. Ancak hangisini kullandığımı bilmem gerekiyor. Örneğin, birisi OpenSSL 1.1.0b'nin büyük bir güvenlik açığına sahip olduğunu tespit ederse, OpenSSL 1.1.0b veya 1.1.0c kullanıp kullanmadığımı daha iyi bilirim
Victor Ronin

Bir yapı yeniden üretilebilirliği ile ilgili olarak, bu muhtemelen ikincil endişem.
Victor Ronin

3

Tam olarak ne kullandığımı nasıl bilebilirim?

Include dosyaları veya libs dosyaları zaten bir sürüm numarası içermiyorsa, her lib klasörüne kendiniz "version.txt" (sürüm numarasını içeren) bir metin dosyası ekleyin ve lib ile birlikte VCS'nize kontrol edin ve dosyaları ekleyin . Bununla birlikte, lib'in tam kaynağını sürümlendirirseniz (3. nokta), olasılıklar yüksektir, zaten sürüm numarasını içeren bir kaynak kodu dosyası vardır, bu nedenle bu durumda kendi dosyalarınızı korumanıza gerek yoktur.

Yapıyı nasıl çoğaltırım?

Olabildiğince otomatikleştirmeye çalışın. En sevdiğiniz oluşturma araçlarının komut dosyalarını, marka dosyalarını veya dosyalarını kullanın. Tüm bunları kaynak kontrolü altına alın. Gerekli manuel adımlar varsa, ayrıntıları bir metin dosyasına yazın (örneğin, readme_build.txt) ve bunu kaynak denetimine de koyun.

Kaynak kodun bir kopyasını almak için bu kütüphaneleri çatallamam gerekir mi?

Bir olmalıdır kaynak kodunun bir kopyasını , ama çatal sadece gerekirse (örneğin, acil bir hata üzerinde yanılmak ve eğer orijinal yazar zaman contraints içinde tamir edemez). Veya yazarlar sizden farklı bir derleyici ortamı kullanıyorsa ve lib'in ortamınızda çalışmasını sağlamak için bazı değişiklikler yapmak gerekir. Ancak, çatalınızdaki orijinal kaynak kodunda yapılan her değişikliğin, güncellemeleri daha sonra entegre etmeyi büyük olasılıkla zorlaştırdığını unutmayın.

Yine de kullandığınız kütüphanelerin orijinal (bilinmeyen) kaynak kodlarının bir kopyasını almanızı tavsiye ederim. Bu, orijinal sürdürücü, lib kaynaklarını genel ağdan kaldırmaya karar verse bile, gerektiğinde lib'i daha sonra çatallamanızı veya korumanızı sağlayacaktır.


Yani, cevap "bunu manuel olarak yap" :) Birisinin söyleyeceğini umuyordum ... oh ... bunun için bir araç var :) "Kaynak kodun kopyası" dediğinizde, sadece tar dosyası ile kaynak ve kaynak kontrolü dökümü?
Victor Ronin

1
@VictorRonin: hayır, cevap "VCS'nizin sizin için yapabileceği her şeyi halletmesine izin verin" ve "standart oluşturma araçlarını kullanarak olabildiğince otomatikleştirin". Belirli bir sürümü seçen sizsiniz ve oluşturma adımlarını tanımlamanız, ortamınız için referansları bağlamanız ve eklemeniz gereken kişisiniz. Bu bağımlılıkları tezahür ettirmenin standart prosedürü komut dosyaları, makefile, proje dosyaları vb. Yoluyladır.
Doc Brown

... ve lib veya kütüphanelerin kaynak kodunu nasıl alacağınız, bakımcının / satıcının nasıl sağladığına bağlıdır. Belki bir zift topu, belki de git hub'a doğrudan erişim, belki bir nuget paketi.
Doc Brown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.