Ruby on Rails'de Gemfile ve Gemfile.lock arasındaki fark nedir


Yanıtlar:


159

GemfileEğer kullanım istediğiniz taşlar belirtmek nerede olduğunu ve hangi sürümlerini belirlemenizi sağlar.

Gemfile.lockBundler yüklenen tam sürümlerini kaydeder nerede dosyasıdır. Bu şekilde, aynı kitaplık / proje başka bir makineye yüklendiğinde, çalıştırma yalnızca en son sürümleri kullanmak ve yüklemek yerine aynı sürümlere bundle installbakacak Gemfile.lockve aynı sürümleri kuracaktır Gemfile. (Farklı makinelerde farklı sürümlerin çalıştırılması hatalı testlere neden olabilir, vb.) Kilit dosyasını doğrudan düzenlemeniz gerekmez.

Check out Bundler en Amaç ve Gerekçe , Sürüm Kontrolü bölümüne özel olarak kontrol edilmesi Kodunuzu.


2
Bu şekilde çalışması gerekir - ancak görünüşe göre Gemfile.lockbazı durumlarda (örneğin rails (4.0.0)gerektirir bundler (>= 1.3.0, < 2.0)) 'açık' sürümleri içerir , bu da sorunlara neden olur. Bu 'açık' bağımlılıklardan nasıl kaçınılacağına dair bir fikriniz var mı?
Guillermo Grau

158

Genellikle Gemfile'da bağımlılıkları şu şekilde yazarız:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

Burada temel olarak şunu söylüyorsunuz: " 1.4.4 sürümünden daha büyük olduğu sürece nokogiri istiyorum ", vb. Şimdi varsayalım ki Gemfile 8 ay önce kurdum ve uygulamamı bu gereksinimle başarılı bir şekilde kurdum. 8 ay önce nokogiri sürümü 1.4.4'tür . Ray uygulamalarım, bu sürümde herhangi bir sorun olmadan mükemmel bir şekilde çalışıyordu.

Şimdi aynı şeyi inşa etmeye çalıştığımı düşünün Gemfile. Ancak nokogiri sürümlerine bakarsak, mevcut kararlı sürümün 1.4.9 olarak değiştiğini görürüz . Bu demektir ki, eğer derlemeye çalışırsak, paketleyici nokogiri'nin 1.4.9 sürümünü yükleyecektir (sahip olmadığımızı varsayalım Gemfile.lock).

Bu ne demek ?

Gördüğünüz gibi hiç sahip değilseniz Gemfile.lockve koşun:

bundle install

o zaman şu anda kullanılan mücevherler herhangi bir zamanda farklı olabilir . Uygulamanız sürümü kullandı 1.4.4 ve 8 ay önce sorunsuz çalışıyor , ancak şimdi oluşturmaya çalışırsanız 1.4.9 sürümünü alırsınız . Belki de son sürümüyle bozulmuş, 1.4.4nokogiri ile kullandığınız harika özellik artık mevcut değil, vb.

Bu tür problemleri önlemek Gemfile.lockiçin kullanılır. Gelen Gemfile.lockyalnızca tam sürümleri yazılır ve bu nedenle sadece bu yüklenecektir. Bu, uygulamanızı bir ile dağıtırsanız Gemfile.lock, her makinede aynı mücevher yüklü olacak ve en önemlisi hepsinin aynı sürümü alacağı anlamına gelir . Bu size kararlı ve ortak bir dağıtım yığını sağlayacaktır.

Gemfile.lock nasıl oluşturulur?

İlk olarak otomatik olarak oluşturulur:

bundle install

Komut. Bundan sonra, her çalıştırdığınızda bundle install, bundle önce Gemfile.lockorada belirtilen mücevherleri arar ve kurar. Tutarlı ve istikrar sağlamak için bu dosyayı projeleriniz arasında dağıtmak bir alışkanlıktır.

Gemfile.lock nasıl güncellenir?

Uygulamalarınızın en son sürümünden güncelleyebileceğinizden memnunsanız Gemfile.lock. Yaptığınız değişiklikleri yansıtın Gemfile. Bu, bağımlılıkları içindeki yeni tam sürümlere değiştirmek anlamına gelir Gemfile. Bundan sonra:

bundle install

Bu sizi Gemfile.locken yeni uygulama sürümünüzle güncelleyecektir .


19
Çok güzel, net bir açıklama (ben yukarı oy verdim); ancak bir nitpick, ancak: nokogiri ~> 1.4.4kurulmasına izin vermez 1.5.3; max olacağını izin 1.4.xnerede x>=4(olurdu Nokogiri için 1.4.7). ~>Operatör aracı sadece son basamak kullanılan taş verilen sürümü "büyüktür" olabilir. Örneğin, foo ~> a.b.c.dherhangi bir sürümünün foohala abc olduğu sürece iyi olduğu anlamına gelir {bir şey} burada {bir şey} >=d. İlgili soruya
michael

1
gem "nokogiri", "~> 1.4.4"Kafamı karıştıran şey, gemfile'da kullanarak belirli sürümleri zaten belirtiyor olmanız. Paketleyici neden bu sürümü kullanamadı? Varsayılan olarak gem'in en son sürümlerini kasıtlı olarak yüklemek için tasarlandığı için mi?
Jonny

@Jonny, michael_n'in yorumuna bakın. ~> 1.4.4 tam bir sürümü belirtmez.
Matthew Flaschen

2
@Jonny, ~> 1.4.4eşdeğerdir >= 1.4.4 and < 1.5. Bundler.io/v1.5/gemfile.html sayfasına bakın . Tam bir sürüm için kullanın gem 'foo', '1.4.4'.
Matthew Flaschen

1
Güzel yanıt, ancak lütfen " Gemfile.lock'u güncelle? " Konusunu açıklığa kavuşturun : Bu bölüm , bir varsa bile bundle installkontrol edeceğini ve yeni kısıtlamalar uygulayacağını mı söylüyor ? GemfileGemfile.lockGemfile.lock
JMess

4

Gemfile.lock

Paket yüklemeyi çalıştırdığınızda, Bundler, kullandığınız tüm mücevherlerin tam adlarını ve sürümlerini (Gemfile (5) 'de belirtilen mücevherlerin bağımlılıkları dahil) Gemfile.lock adlı bir dosyada saklayacaktır.

Bundler, bu dosyayı sonraki tüm paket yükleme çağrılarında kullanır ve bu da, uygulamanız makineler arasında hareket ederken bile her zaman aynı kodu kullanmanızı garanti eder.

Bağımlılık çözümünün çalışma şekli nedeniyle, görünüşte küçük bir değişiklik bile (örneğin, Gemfile (5) 'nizdeki bir mücevher bağımlılığının bir nokta sürümünde yapılan bir güncelleme), tüm bağımlılıkları karşılamak için radikal olarak farklı cevherlere ihtiyaç duyulmasına neden olabilir.

Sonuç olarak, Gemfile.lock'unuzu sürüm kontrolü için kontrol etmelisiniz. Bunu yapmazsanız, deponuzu kontrol eden her makine (üretim sunucunuz dahil) tüm bağımlılıkları tekrar çözecek ve bu da Gemfile'daki (5) değerli taşlardan herhangi biri veya herhangi biri ise üçüncü taraf kodunun farklı sürümlerinin kullanılmasına neden olacaktır. bağımlılıkları güncellendi.

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.