Yanıtlar:
Gemfile
Eğer kullanım istediğiniz taşlar belirtmek nerede olduğunu ve hangi sürümlerini belirlemenizi sağlar.
Gemfile.lock
Bundler 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 install
bakacak Gemfile.lock
ve 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.
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
).
Gördüğünüz gibi hiç sahip değilseniz Gemfile.lock
ve 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.lock
için kullanılır. Gelen Gemfile.lock
yalnı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.
İlk olarak otomatik olarak oluşturulur:
bundle install
Komut. Bundan sonra, her çalıştırdığınızda bundle install
, bundle önce Gemfile.lock
orada 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.
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.lock
en yeni uygulama sürümünüzle güncelleyecektir .
nokogiri ~> 1.4.4
kurulmasına izin vermez 1.5.3
; max olacağını izin 1.4.x
nerede 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.d
herhangi bir sürümünün foo
hala abc olduğu sürece iyi olduğu anlamına gelir {bir şey} burada {bir şey} >=
d. İlgili soruya
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?
~> 1.4.4
eş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'
.
bundle install
kontrol edeceğini ve yeni kısıtlamalar uygulayacağını mı söylüyor ? Gemfile
Gemfile.lock
Gemfile.lock
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.
Gemfile.lock
bazı durumlarda (örneğinrails (4.0.0)
gerektirirbundler (>= 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ı?