Gemfile.lock .gitignore içine dahil edilmelidir?


501

Ben bundler ve onun oluşturduğu dosyaları yeni. GitHub birçok kişi tarafından katkıda bulunan bir git repo bir kopyasını var, bu yüzden bundler deposunda olmayan ve .gitignorelistede olmayan bir dosya oluşturduğunu bulmak için sürpriz oldu .

Çatalladığımdan beri, repoya eklemenin ana repo için hiçbir şey kırmayacağını biliyorum, ancak bir çekme isteği yaparsam, bir soruna neden olur mu?

Depoya Gemfile.lockdahil edilmeli midir?



2
Burada aynı repoyu paylaşan Linux ve Windows kutularınız olduğu için yolunuzu bulduysanız, Joe Yang'ın cevabına bakın. Yazdığım sırada bu üçüncü sırada yer alıyor. Ayrıca bkz. Stackoverflow.com/questions/14034561/…
Peter Berg

Yanıtlar:


549

Bir rubygem yazmadığınızı varsayarsak, Gemfile.lock deponuzda olmalıdır. Gerekli tüm mücevherlerin ve bağımlılıklarının bir anlık görüntüsü olarak kullanılır. Bu şekilde paketleyicinin her dağıtımınızda vb. Tüm değerli taş bağımlılıklarını yeniden hesaplaması gerekmez.

Aşağıdaki cowboycoded yorumundan:

Bir mücevher üzerinde çalışıyorsanız, Gemfile.lock'unuzu kontrol ETMEYİN. Bir Rails uygulaması üzerinde çalışıyorsanız, Gemfile.lock'unuzu kontrol edin.

Kilit dosyasının ne olduğunu açıklayan güzel bir makale .


88
Ne üzerinde çalıştığınıza bağlı. Bir mücevher üzerinde çalışıyorsanız, Gemfile.lock'unuzu kontrol ETMEYİN. Bir Rails uygulaması üzerinde çalışıyorsanız, Gemfile.lock'unuzu kontrol edin. Burada daha fazla bilgi - yehudakatz.com/2010/12/16/…
johnmcaliley

Yararlı makale için teşekkürler.
ashisrai_

1
kovboykodunun söylediklerini cevabınıza yeniden koymalısınız: cevherler.
aarona

Makale bağlantısı için yeni bir href gerekiyor.
Ross

4
Lütfen bunu yapma! Gemfile.lock'unuzu olduğu yerde tutun! Burada ve burada dediğim gibi .
Ricardo Ruwer

50

Gerçek sorun, yapılandırılabilir bir veritabanı adaptörüne sahip olması gereken açık kaynaklı bir Rails uygulaması üzerinde çalışırken ortaya çıkar. Fat Free CRM'nin Rails 3 dalını geliştiriyorum. Benim tercihim postgres, ancak varsayılan veritabanının mysql2 olmasını istiyoruz.

Bu durumda, Gemfile.lockyine de varsayılan mücevher seti ile kontrol edilmesi gerekiyor, ancak makinemde yaptığım değişiklikleri yok saymam gerekiyor. Bunu başarmak için:

git update-index --assume-unchanged Gemfile.lock

ve tersine çevirmek için:

git update-index --no-assume-unchanged Gemfile.lock

Ayrıca, aşağıdaki kod gibi bir şeyi eklemek için kullanışlıdır Gemfile. Bu, database.yml dosyasını temel alarak uygun veritabanı bağdaştırıcısını yükler.

# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2"     => ["mysql2", ">= 0.2.6"],
           "postgresql" => ["pg",     ">= 0.9.0"],
           "sqlite3"    => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
  db = YAML.load_file(db_config)
  # Fetch the first configured adapter from config/database.yml
  (db["production"] || db["development"] || db["test"])["adapter"]
else
  "mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------

Bunun yerleşik bir en iyi uygulama olup olmadığını söyleyemem, ama benim için iyi çalışıyor.


2
Çok yararlı bilgiler ... neden sadece 3 puan aldığınızdan emin değilsiniz ve daha az faydalı bir cevabın 50 puan var. Oh, evet, tarih damgalarına bak. (SO'nun en büyük başarısızlıklarından biri, soru sorulduktan hemen sonra cevaplamaya tahakkuk eden orantısız faydalardır.)
iconoclast

1
@iconoclast: Yaptıklarınızı paylaştığınıza gerçekten sevindim. Ben de dahil olmak üzere bu göreve gelen birçok kişi soru başlığı tarafından "kör" olduğunu düşünüyorum. Şimdi cevabımın sadece belirli bir kullanım örneğine cevap verdiğinin ve bu sorunun doğru cevabı olması gerekmediğinin farkındayım. Yakın gelecekte güncelleme üzerinde çalışacağım. Bununla birlikte, OP ihtiyacını karşılamıyorsa cevabımı doğru olarak işaretlememeliydi.
rwilliams

34

Çalışma arkadaşlarım ve ben farklı Gemfile.lock var, çünkü farklı platformlar, pencereler ve mac kullanıyoruz ve sunucumuz linux.

Gemfile.lock'u repo ile kaldırmaya ve git repo'da Gemfile.lock.server oluşturmaya karar veriyoruz, tıpkı database.yml gibi. Daha sonra sunucuda konuşlandırmadan önce, Gemfile.lock.server'ı cap konuşlandırma kancasını kullanarak sunucuda Gemfile.lock'a kopyalarız


5
OSX'te geliştirdiğim ve daha sonra bir Windows sunucusunda dağıtmam gereken bir uygulamam var. Git ile Gemfile.lock izleme kötü bir fikir olduğunu kanıtladı bu yüzden .gitignore dosyama gitti. Birçok mücevher farklı ortamlar için farklı versiyonlar gerektirir. İdeal olarak bu durumda olmaktan kaçınmalısınız, ancak başka seçeneğim yoktu (lanet olsun BT departmanı!)
brad

11

R-dub ile aynı fikirde olmak, onu kaynak kontrolünde tutmak, ama benim için asıl fayda şudur:

özdeş ortamlarda işbirliği (windohs ve linux / mac şeyler dikkate alınmadan). Gemfile.lock'tan önce, projeyi yükleyecek bir sonraki adam, kendini suçlayan her türlü kafa karıştırıcı hataları görebilir, ancak o, süper bağımlılığın bir sonraki sürümünü alan ve mevcut bağımlılıkları bozan şanslı bir adamdı.

Daha da kötüsü, bu sunucularda gerçekleşti, disiplinli olmadıkça test edilmedi ve tam sürümü yükleyin. Gemfile.lock bunu açıkça ortaya koymaktadır ve açıkça sürümlerinizin farklı olduğunu söyleyecektir.

Not: şeyleri gruplandırmayı unutmayın, geliştirme: ve test


11

Bundler dokümanları bu soruyu da ele alır:

ORİJİNAL: http://gembundler.com/v1.3/rationale.html

DÜZENLE: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

"Kodunuzu Sürüm Kontrolüne Kontrol Etme" bölümüne bakın:

Bir süre uygulamanızı geliştirdikten sonra Gemfile ve Gemfile.lock anlık görüntüsü ile birlikte uygulamayı kontrol edin. Şimdi, deponuzda uygulamanın çalıştığından emin olduğunuz son kez kullandığınız tüm mücevherlerin tam sürümlerinin bir kaydı var. Gemfile'nizde yalnızca üç değerli taş (farklı derecelerde sürüm kesinliği ile) listelerken, uyguladığınız değerli taşların tüm örtülü gereksinimlerini dikkate aldığınızda, uygulamanızın düzinelerce değerli taşlara bağlı olduğunu unutmayın.

Bu önemlidir: Gemfile.lock, uygulamanızı hem kendi kodunuzdan hem de her şeyin çalıştığından emin olduğunuz son bildiğiniz üçüncü taraf kodundan oluşan tek bir paket haline getirir. Gemfile'nizde bağımlı olduğunuz üçüncü taraf kodunun tam sürümlerini belirtmek aynı garantiyi sağlamaz, çünkü taşlar genellikle bağımlılıkları için bir dizi sürüm bildirir.

Aynı makinede bir sonraki paket yüklemesini çalıştırdığınızda, paketleyici zaten ihtiyacınız olan tüm bağımlılıklara sahip olduğunu görür ve yükleme işlemini atlar.

.Bundle dizinini veya içindeki dosyaları kontrol etmeyin. Bu dosyalar her bir makineye özgüdür ve paket kurulum komutunun çalıştırılması arasındaki kurulum seçeneklerini sürdürmek için kullanılır.

Paket paketi çalıştırdıysanız, paketinizin gerektirdiği taşlar (git mücevherleri olmasa da) satıcıya / önbelleğe indirilir. Bundler, ihtiyacınız olan tüm taşlar bu klasörde mevcutsa ve kaynak kontrolünüzde kontrol edilmişse, internete (veya RubyGems sunucusuna) bağlanmadan çalışabilir. Bu, isteğe bağlı bir adımdır ve kaynak denetim deponuzun boyutunun artması nedeniyle önerilmez.


4

Gemfile.lock yok:

  • Yeni katılımcılar tuhaf şeyler başarısız olduğu için test yapamazlar, bu nedenle PR'lere katkıda bulunmazlar veya başarısız olmazlar ... kötü ilk deneyim.
  • yerel Gemfile.lock'unuzu kaybettiyseniz, balta yaşındaki projeye geri dönemez ve projeyi güncellemek / yeniden yazmak zorunda kalmadan bir hatayı düzeltemezsiniz

-> Her zaman Gemfile.lock'ta kontrol edin, ekstra ayrıntılı olmak istiyorsanız travmanın silinmesini sağlayın https://grosser.it/2015/08/14/check-in-your-gemfile-lock/


3

Partiye biraz geç kaldım, ama cevaplar hala zamanımı aldı ve bu sorunu anlamak için yabancı okumalar. Bu yüzden Gemfile.lock hakkında neler bulduğumu özetlemek istiyorum.

Bir Rails Uygulaması oluştururken, yerel makinenizde mücevherlerin belirli sürümlerini kullanıyorsunuz. Üretim modundaki ve diğer dallardaki hatalardan kaçınmak istiyorsanız, o bir Gemfile.lock dosyasını her yerde kullanmanız ve bunder'a bundleher değiştiğinde mücevherleri yeniden oluşturmasını söylemeniz gerekir.

Eğer Gemfile.locküretim makinede değişti ve Git izin vermez git pull, sen yazmalısın git reset --hardbu dosya değişikliğini önlemek ve yazmak için git pulltekrar.


Bir dosya otomatik olarak değişirse, örneğin bir oluşturma işlemi ile, sürüm kontrolüne eklenmemesi gerektiği açık bir işarettir.
Thomas
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.