Çerçeve çalışma zamanlarını kaynak kontrolü altında saklamak iyi bir uygulama mı?


9

Birçok yazılım mağazasının ikili dosyaları kaynak kontrolü altında tuttuğunu biliyorum . Ancak, mağazamız tüm çerçeveleri depoda depolamaya gelmişti: DirectX çalışma zamanı, CUDA, nVidia Optix, her neyse.

Bir dev makine kurulumunu daha kolay hale getirdiği söylenir (sözde, en son sürümü alın ve kodlamaya başlayın). Bununla birlikte, havuzu önemli ölçüde şişirir ve ilgisiz tarihle yükler.

Hiç böyle bir kullanım şekli görmedim. Bunun iyi bir uygulama olduğunu düşünüyor musunuz?

[EDIT:] Kaynak denetimli izole 3. taraf ikili dosyalarında sorunum yok. Soru, tipik olarak 10'dan fazla ikili dosyadan oluşan tüm çerçeve çalışma zamanlarını ifade eder. Aşırı bir örnek olarak, Windows SDK'yı (depoda tutmuyoruz, şükürler olsun, ama prensipte hiçbir fark görmüyorum) alın.


1
En son veya ilgili çerçeve çalışma zamanlarını indiren bir komut dosyası oluşturabilir ve bu komut dosyasını sürüm denetimine alabilirsiniz.
Basile Starynkevitch

2
Neden bunun [depo] ile alakasız tarih yükü olduğunu düşünüyorsunuz ? Daha spesifik olarak, tarihin neden alakasız olduğunu düşünüyorsunuz ? Kodunuz bu çerçevelere ve kitaplıklara başvuruyorsa, depodaki belirli bir düzeltmede hangi sürümlerin kullanıldığını bilmek çok yararlıdır.
James McNellis

Şişkinlik konusunda hemfikirim (özellikle bu çalışma zamanları birden fazla proje arasında paylaşılıyorsa), ancak alakasız tarihle ilgili kısmı anlamıyorum. Örneğin, bir çalışma zamanının hangi sürümünü kullandığınızda bir değişiklik oldukça önemlidir ...
6502

Güncellemeler çıktıkça geliştirici makinesinin resimlerini oluşturmak daha kolay olmaz mıydı?
Ramhound

@Ramhound: itmeye çalıştığım yön bu. Kaybettiğim dezavantajlar olup olmadığını merak ettim.
Ofek Shilon

Yanıtlar:


6

İkili dosyalar genellikle sürüm kontrol sistemi için uygun değildir, çünkü:

  • sürüm kontrol özelliklerinden (birleştirme, fark) yararlanmazlar
  • repo büyüklüğünü artırmak ...
  • ... önemli olan, basit paylaşılan paylaşımlı dizinler olan Nexus gibi yapay depoların aksine (temizlemesi kolay: + !) VCS'den bir sürümü kolayca kaldırmamanızdır ( geçmişi korumak için VCS yapılır ).cdrm
  • VCS'de metin , yol + sürüm bildirimi olarak referans gösterilmelidir : ikili sürümdeki herhangi bir değişikliği o metin dosyasında (Nexus kullanıyorsanız pom.xml gibi) bir değişiklik olarak kaydederek ilgili geçmişi bu şekilde tutabilirsiniz. Örneğin)

1
Son nokta çok değerlidir.
Noufal Ibrahim

Teşekkürler! C ++ projeleri için benzer bir eser deposu biliyor musunuz? Daha da iyisi - belki TFS ile entegre olan?
Ofek Shilon

2
@OfekShilon: Nexus teorik olarak her türlü eseri saklayabilir. Ancak .NET / C ++ için depolama ve bağımlılık yönetimi için NuGet'iniz de vardır: nuget.codeplex.com . Net için örnek: lostechies.com/derekgreer/2011/09/20/… . C ++ projelerini de desteklemelidir: nuget.codeplex.com/discussions/280649 .
VonC

@OfekShilon TFS'yi NuGet ile bağlayabilirsiniz (örneğin: coolthingoftheday.blogspot.com/2011/08/… , hanselman.com/blog/… ). Ayrıca bakınız TFSNuGetter: nugetter.codeplex.com
VonC

6

İkili varlıkları kontrol eden sürümü ile iyiyim. Ben oluşturulan dosyaları kontrol sürümüne karşıyım .

Ayrıca, ortam kurulumu geliştirmeden farklı bir şeydir. Çoğunlukla Python'da gelişiyoruz ve bir proje için hafif bir yalıtılmış ortam (kütüphaneler dahil) oluşturmanıza izin veren virtualenv adlı bir aracı var. Kaynaklarımızı kontrol ettiğimizde, orada bu virtualenv'i oluşturan bir kurulum betiğimiz var. Bir bildirim kullanarak, bu, kitaplıkların hangi sürümlerinin gerekli olduğunu ve diğer şeyleri belirtir. Bunların hiçbiri sürüm kontrollü değildir. Yalnızca kurulum komut dosyasıdır.

Tüm çerçeveyi ana projeniz altında atmak, geçmişinizi karmaşıklaştıracak ve işleri ciddi şekilde mahvedecektir. Bu, projenizin bir parçası değildir ve farklı şekilde ele alınmalıdır.


3

Çerçeve sürümleriyle yapılandırma yönetimi yapmak genellikle iyi bir fikirdir. Kodunuzun belirli bir DirectX sürümüne ihtiyacı varsa, bu sürüm kolayca kullanılabilir olmalı ve yazılımınızın eski bir sürümüne göz atıyorsanız, hangi harici bağımlılıklara sahip olduğunu belirlemek kolay olmalıdır.

Burada iyi bir fikir olduğunu düşünmediğim şey, bu ikili dosyaları depolamak için tipik sürüm kontrol sisteminizi kullanmaktır. Şirketimizde çerçevelerin, kitaplıkların ve harici araçların her sürümünü bir ağ sürücüsünde bir alt klasör yapısında depolarız. Mantıklı olduğunu düşündüğümüz yerde, hangi araç sürümünün hangi yazılım sürümüne ait olduğunu belgelemek için benioku dosyalarımız var veya mümkünse belirli bir sürümü yüklemek veya kullanmak için komut dosyalarımız var. Yalnızca bu benioku dosyaları ve komut dosyaları sürüm denetimine girer.

Ayrıca, araçların ve kitaplıkların eski sürümlerini, yeniden oluşturma ihtiyacımız olabileceğini düşündüğümüz sürece ve bu araçlara bağlı olarak eski sürümü de saklıyoruz. Bu şekilde bize, kullanımdan kaldırıldıklarında ağ sürücümüzden çok eski kütüphanelerin ve araçların bir kısmını silme imkanı verir (elbette, harici medyada arşivlerimiz olması durumunda).


2

İkili programların bir yerlerde depo olması gerektiğini düşünüyorum. Onları bir havuzun dışında saklamanızı öneririm, özellikle de büyükse ve büyük kullanıma alma sürelerine yol açarsanız. Bunun kötü bir uygulama olduğunu görmeyeceğim, ama aynı zamanda gördüğüm bir uygulama da değil.

Kuruluşunuzda farklı çalışma zamanı sürümlerini hedefleyen çok sayıda proje varsa bu aslında iyi bir fikir olabilir. Doğru projeler üzerinde çalışırken doğru çalışma zamanı ikilisine sahip olmanızı sağlar.


Bu sorunu çözmek için soruyu açıkladım.
Ofek Shilon

1

Şahsen bunu çok kötü bir uygulama olarak görüyorum. Kurulum talimatlarını içeren bir wiki oluşturmayı ve gerekli ikili dosyaları yüklemeyi tercih ederim. Bu dosyalar sadece yeni geliştiriciler tarafından gereklidir, herkesin depolarını şişirmeye gerek yoktur.


1

Bunu yapmak için iyi bir neden var, yani ihtiyacınız olan her şey tek bir yerde, herhangi bir dış bağımlılık olmadan.

Bu düşündüğünüzden çok daha önemlidir. Temel olarak, bir satıcı sunucusundaki birkaç yıl sonra gidebilecek bir yapıya güvenmemenizi sağlar, çünkü şirket içinde her şeye sahipsiniz.

Havuz şişkinliği ile ilgili. Bu, yalnızca klonlama ve / veya güncelleme yavaş olacağından VCS'niz tam bir yerel kopya tutarsa ​​(git bunu yapar, cvs yapmaz) bir sorundur. Buna karşılık, her geliştirme makinesinde, bir nedenden dolayı merkezi yedekleme planınız bir gün başarısız olursa şirketinizi kurtarabilecek kopyalara sahip olacaksınız.

Bu bir öncelik veya politika meselesidir. Karar kasıtlı olduğu sürece, bu konuda iyi olurdum.


2
Üçüncü taraf kitaplığınızı kendi Nexus veya NuGet sunucunuz gibi bir yapay yapı deposunda saklarsanız, "satıcı" sunucusunun kaybolmasından korkmanıza gerek kalmaz. Tabii ki, onları yerel olarak saklayın. Sadece VCS kullanmayın. Bu tür dosyaları saklamak için tasarlanmamışlardır.
VonC

@VonC, altyapınıza ve çalışma yönteminize bağlıdır. "Tek bir ikili dosyayı sadece bir kez depolayın" için, bir VCS tam bir artefakt deposu kadar iyi olabilir. Ayrıca altyapıyı basit tutar. Ben savunmuyorum - OP böyle bir kullanım şekli görüp görmediğini sordu.

Tamam. Böyle bir kullanım şekli gördüm. Bu tür depoları yönetmek zorunda kaldım (esas olarak SVN veya ClearCase gibi VCS'yi merkezi hale getirin, Git gibi DVCS için bu kullanımı hiç görmedim). Ve bu genellikle bir karmaşa. Satıcı kitaplıklarını yeniden düzenlediğinizde, nadiren tek bir ikili dosya depolarsınız. Yamalarla uğraşmak zorundasınız. Çoğu. Artı depolama (imiş, VCS tek amaç değil belki tartışmalı bir potansiyel çözüm olabilir). Bağımlılık yönetimi. Ve Nexus veya NuGet'in sundukları (yönetimi ve temizlenmesi kolay bir depolamaya ek olarak).
VonC
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.