Sürüm ikili dosyalarını sürüm kontrolü altında nasıl tutarsınız?


14

Sürüm ikili dosyalarını sürüm kontrolü altında nasıl tutarsınız? Bu, her sürüm arasında hangi öğelerin değiştirildiğini izlemenizi sağlar. Yayınlanan ikili dosyaları kaynak havuzundan ayırmak istiyorum. Yayınlanan ikili dosyalar Sürekli Entegrasyon yazılımından oluşturulur veya manuel olarak derlenir.


"Hangi şeylerin değiştiğini izle" ile ne demek istiyorsun? Sürüm ikili dosyalarının hangi özelliklerini izliyorsunuz (ya da olmak istiyorsunuz)? Sadece tuhaf görünüyor, bu yüzden merak ediyorum.
Jeremy Heiler

örn. v1.0.0 ve v1.0.1 arasında, sadece ABC.exe değiştirilirken, DEF.dll bağımlılığı değişmeden kalır
13'te linquize

1
Bunu ikili dosyalara bakarak nasıl belirlersiniz?
Jeremy Heiler

aynı dosyanın eski ve yeni sürümü diff
linquize

Yanıtlar:


21

İki seçenek:

a) Yapma. Sadece tekrarlanabilir deterministik yapılara sahip olduğunuzdan emin olun, yani aynı konfigürasyon ile aynı kaynak kontrol revizyonunu oluşturmak her zaman tam olarak aynı ikiliyi üretir.

b) Yayınlanmış derlemeler için yetkili bir kaynak olarak bir dizini atayın. İkilileri yüklemeyi dağıtım / gönderim prosedürünün bir parçası haline getirin ve yayımlanmış derleme dizininin yedekleme planınız tarafından kapandığından emin olun. Burada herhangi bir sürüm kontrolüne ihtiyacınız yoktur; yapılar bir kez yazılır, herhangi bir şeyi değiştirmeniz gerekirse, yeni bir yapı oluşturursunuz.

Her iki durumda da, ikili dosyalar ve diğer derleme çıktıları birçok nedenden dolayı kaynak kontrolü altında değildir.


7
a) elbette çoğu kez mümkün değildir blogs.msdn.com/b/ericlippert/archive/2012/05/31/…
jk.

@jk: güzel bağlantı. Kaynak kodu ve tüm giriş dosyaları tamamen kaynak kontrolü altında (ve doğru derleyici sürümü yüklü) oluşturmak için tüm girdi dosyaları sahip gerçek dünya senaryoları (ve tabii ki başkalarında yeterli değil) bir sürü "deterministik" olabilir sanırım ). Tekrarlanabilir ikili dosyaları birer birer bulundurmanın ne kadar önemli olduğuna bağlıdır.
Doc Brown

10

Sürüm kontrol sistemini değil, ikili dosyalar için bir yapay yapı deposu kullanın. Serbest bırakılan bir ikili dosyanın belirli bir sürümünün zaman içinde değişmesi beklenmez, bu nedenle dosya (lar) değişmeyeceğinden sürüm kontrolü mantıklı değildir.

Örneğin, sürümleri arşivlemek / yayınlamak / sunmak / diğer ikili dosyaları (örn. Belgeler gibi) arşivlemek için Maven depolarına bakın.


yayımlanan bir kaynak dosyanın belirli bir sürümünün de zaman içinde değişmesi gerekmez. SCM, sevk edilen ikili dosyayı koymak için iyi bir yerdir, sadece oluşturmak için kullanılan kaynak dosyalarının yanında saklarsınız.
gbjbaanb

2
gbjbaanb, SCM "Kaynak Kontrol Yönetimi" anlamına gelir. Bu, herkese bu sistemlerin ikili dosyaları depolamak için tasarlanmadığını, kaynak sağladığını söyleyecektir. Hala ikili dosyaları saklamak istiyorsanız, devam edin. Yapmayacağım.
mhaller

4
SCM "Yazılım Kontrol Yönetimi" anlamına gelir, ancak güzel bir deneme. "kaynak kodu" genellikle sadece metin dosyaları değil, resimler, belgeler, diyagramlar vb.
gbjbaanb

Normalde, "Yazılım Yapılandırma Yönetimi." "Yazılım Kontrol Yönetimi" ni hiç duymadım.
James McLeod

7

Git (siz ikili dosyaları iyi bir şekilde birleştirmez, bu yüzden onları kendiniz yönetmeniz gerekmiyorsa) ya da çok fazla taahhütte bulunmadıkça (yalnızca gemi hazır, her inşa zaman değil).

Çoğu SCM delta ikili oldukça iyi, biz SVN bizim 2Mb kaynak dll koymak için kullanılan ve her defasında birkaç kb delta olur.

Ben SCM'lerin kaynak için olduğunu, ikili değil birçok argüman duyuyorum ama çoğu simge sadece simge dosyaları olsa bile, yazılım çoğu görüntüden oluşur düşününce bu açıkça yanlıştır. Onlar ikili, ama kaynağın bir parçası, bu yüzden onları koyun ve bu konuda çok dogmatik olmayın. Ayrıca, gerektiğinde ikili dosyayı yeniden oluşturabileceğinizi de duydum, genellikle durum böyle, ancak artık aktif olarak desteklenmeyen eski sistemler için büyük bir zaman harcayan çaba olabilir. 3 yıl önce bir ikili dosya oluşturmak için kullanılan sisteme karşılık gelecek şekilde yalnızca daha eski hizmet paketleri veya yamaları olan bir sistemi yeniden oluşturmanız gerekirse, o zaman bölmeyi SCM'nize eklemenize sevinirsiniz.

SCM'nize derleme ekleme konusunda endişelenmeniz gereken tek şey, bunu otomatik olarak derleme sunucusu işleminin bir parçası olarak yapıyorsanız - bunu yapma. SCM'nizi size faydası olmayan yapılarla dolduracaksınız. Bunun yerine yalnızca yayınlandığında ekleyin. Bu şekilde müşterinizin tam olarak ne olduğunu bilirsiniz ve müşteri tarafından bildirilen sorunları, yeniden oluşturduğunuzlarla (derleyicinin veya işletim sisteminin en son güncellemelerini kullanarak) değil, kullandıkları ikili dosyalarla yeniden oluşturabilirsiniz.


1
@ MarnenLaibow-Koser uzun süredir sektörde çalışmadınız. Oluşturma ortamları zamanla değişir, bu nedenle eski bir ortamı yeniden oluşturabilirken, envanteri doğru eski araçlar ve SDK'larla yeniden oluşturmak için günler harcamanız gerekecektir. Umarım sürüm yapıyorsun ....
gbjbaanb

1
Microsoft'un artık yayınlamak için uygun görmediği eski bir SDK kullanarak bir XP makinesinde derlenmiş eski bir VC6 ikili dosyası oluşturabileceğinizi düşünüyorum. Birisi bu ikiliyi isterse, diğer her şeyin depolandığı yerden aynı yerden tutulması kolaydır. Bunu yeniden inşa etmek zorunda kalmanın acısıyla karşılaştırıldığında muazzam bir yönetim maliyeti ve kaynakla birlikte depolamanın maliyeti önemsizdir. Orada bulundum (müşteri bir hata bildirdiğinde 3. taraf kontrolü ile yapılan bir VB6 uygulamasıyla - ikili almak ve çalıştırmak, yeniden inşa etmekten çok daha kolaydı, bu imkansız olduğu ortaya çıktı)
gbjbaanb

1
@gjbaanb Ayrıca benden farklı bir durumda olduğunuzu da itiraf edeceğim: tüm dış bağımlılıklarım OSS, bu yüzden bazı şirketler artık onları serbest bırakmak için uygun görmediği için gidemezler.
Marnen Laibow-Koser

1
Anlatmak SCMS böylece gerek yoktur, her şeyi saklayabilirsiniz olmasıdır değil kaynağından ayrı ikili saklayın. Kullanışlı ve kolay ve yıllar sonra ne olduğunu bilmenizi sağlar. Bunu yapmanın bir dezavantajı yok. Belirli bir sürümün kendisi de yalnızca belirli bir kaynak taahhüdü ile senkronize edilir. Ben bazı insanlar SCM sadece kaynak kodu metni anlamına geliyor düşünüyor sorun görmüyorum. Hayır, neredeyse her şeyi saklamak için kullanın (bazen büyük değilse araçlar veya kütüphaneler inşa edin), hayat çok daha kolay hale gelir.
gbjbaanb

1
@gjbaanb Demek istediğim, bu konuda yanlışsın. :) Elbette, VCS'ler her şeyi saklayabilir, ancak sadece bir taahhüt için yaşayan dosyaları depolamak için iyi ayarlanmamıştır (sonuçta, r500'ün r550'deki repoda oluşturulmasını istemezsiniz; sadece kafa karıştırıcı olacaktır) . Repo inşa ürünleri depolamak ile temel problem onlar bu değil mi ikili , ancak konum edilen verileri ve aynı repo kendi kaynağı ile senkronize dışarı gidecek. Kullandığım aynı argümanlar oluşturulan metin dosyaları için de geçerlidir.
Marnen Laibow-Koser

5

Sürüm ikili dosyalarını sürüm denetimi altında tutmuyorum. Bunun yerine, onları iyi tanımlanmış bir yerde yayınlıyorum, böylece diğer araçlar ve bunları inceleyip kullanıyorum. Java'da çok iş yapıyorum, yani Kavanozları yerel Maven depolarına yayınlıyorum. Ancak, bu araçları sürüm başına nelerin değiştiğini izlemek için kullanmıyorum. Sonuçta, onlar ikili ve dosya sayısı dışında izlemek için çok fazla bir şey yok.

Sürümler arasındaki değişiklikleri izlemek için sürüm kontrol sistemimdeki sürümleri sürümün sürüm numarasıyla etiketleyebilir veya etiketleyebilirim. Ama bu sadece ikili dosyaları değil, sadece kaynak dosyaları izlemek içindir. İkili dosyalar yapının eserleridir ve sürüm denetimi altında olmaları gerekmez.


1

En iyi çözüm, kurumsal olarak önemli tüm yapılar (sürümler, sürüm adayları vb.) İçin CI sisteminizi özel olarak kullanmaktır.

Bu, yayımlanan ikili dosyaları depoda gerçekte depolamak zorunda kalmadan depo içeriğine sistematik olarak bağlar.

Örneğin, SVN kullanıyorsanız, şube ana kuruluş şemasını kullanın; / trunk içinde tüm günlük gelişimi yapın ve hazır olduğunda her sürüm için bir / etiketi oluşturun.

CI sisteminizi etiketlerin yanı sıra gövdeden de oluşturulacak şekilde yapılandırın ve çıktısı, deponun en üst düzey yapısını yansıtan bir ağ dizinine yazmasını sağlayın:

  • / İnşa / gövde / [devir] [tarih] [build_id] /
  • / İnşa / etiketler / release_0_1_3beta4 / [devir] [tarih] [build_id] /

Derleme sisteminin / builds / trunk / dizinine dairesel bir arabellek gibi davranması , son n derlemenin depolanması, eski derlemelerin giderken silinmesi gerekir.

/ İnşa / etiketler / dizin, diğer taraftan, kalıcı bir mağaza. Derleme yapılarının kendileri aşağıdaki şemaya göre oluşturulan adlarla dizinlerde saklanır:

  • [Rev] [tarih] [build_id]

burada [rev] , SVN revizyon kimliğidir, [tarih] YYYYMMDD biçimindeki tarihtir ve [build_id] , ilk derlemeden itibaren artan, her derleme dizinini benzersiz yapan 3 basamaklı benzersiz bir sayaçtır.

Yukarıda açıklanan işlem size aşağıdaki avantajları sağlar:

  1. Yapı yapıları, bunları üreten kaynağa sistematik olarak bağlanır, böylece belirli bir yapı yapay nesnesi için kaynağı kolayca bulabilirsiniz (ve tersi de geçerlidir).

  2. Bu, daha ileri sürüm otomasyonunun temelini oluşturur. Örneğin, serbest bırakma belgelerinin otomatik oluşturulması vb ...

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.