Jawaban:
Di Gemfile
sinilah Anda menentukan permata mana yang ingin Anda gunakan, dan memungkinkan Anda menentukan versi mana.
The Gemfile.lock
file mana Bundler mencatat versi yang tepat yang dipasang. Dengan cara ini, ketika pustaka / proyek yang sama dimuat pada komputer lain, menjalankan bundle install
akan melihat Gemfile.lock
dan menginstal versi yang sama persis, daripada hanya menggunakan Gemfile
dan menginstal versi terbaru. (Menjalankan versi yang berbeda pada mesin yang berbeda dapat menyebabkan tes yang rusak, dll.) Anda tidak perlu mengedit file kunci secara langsung.
Lihat Tujuan dan Dasar Pemikiran Bundler , khususnya bagian Memeriksa Kode Anda ke dalam Kontrol Versi.
Biasanya kami menulis dependensi di Gemfile sebagai:
gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
Di sini Anda pada dasarnya mengatakan: " Saya ingin nokogiri selama ini lebih besar dari versi 1.4.4 ", dll. Sekarang anggaplah saya telah mengatur Gemfile
8 bulan yang lalu dan saya berhasil mengatur aplikasi saya dengan persyaratan ini. 8 bulan lalu versi nokogiri adalah 1.4.4 . Aplikasi rails saya berjalan dengan sempurna tanpa masalah dengan versi ini.
Sekarang pikir saya mencoba untuk membangun dengan yang sama Gemfile
. Tetapi jika kita melihat versi nokogiri kita melihat bahwa versi stabil saat ini telah berubah menjadi 1.4.9 . Itu berarti jika kita mencoba membangun, bundler akan menginstal nokogiri versi 1.4.9 (misalkan kita tidak punya Gemfile.lock
).
Seperti yang Anda lihat jika Anda tidak memiliki Gemfile.lock
dan menjalankan:
bundle install
maka permata yang saat ini digunakan dapat berbeda setiap saat . Aplikasi Anda menggunakan versi 1.4.4 dan berfungsi 8 bulan lalu tanpa masalah, tetapi jika Anda mencoba membuatnya sekarang Anda mendapatkan versi 1.4.9 . Mungkin rusak dengan versi terbaru nokogiri
, fitur luar biasa yang Anda gunakan dengan 1.4.4 tidak lebih tersedia, dll.
Untuk mencegah masalah seperti Gemfile.lock
ini digunakan. Dalam Gemfile.lock
hanya versi yang tepat ditulis dan dengan demikian hanya ini akan dipasang. Itu berarti jika Anda mendistribusikan aplikasi Anda dengan Gemfile.lock
, setiap mesin akan memiliki permata yang sama terpasang dan yang paling penting semuanya mendapatkan versi yang sama . Ini akan memberi Anda tumpukan penyebaran yang stabil dan umum.
Secara otomatis dibuat dengan yang pertama:
bundle install
perintah. Setelah itu setiap kali Anda menjalankan bundle install
, bundel pertama-tama akan mencari Gemfile.lock
dan menginstal permata yang ditentukan di sana. Merupakan kebiasaan untuk mendistribusikan file ini di antara proyek Anda untuk memberikan secara konsisten dan stabilitas.
Jika Anda senang dengan versi terbaru aplikasi Anda daripada yang bisa Anda perbarui Gemfile.lock
. Hanya mencerminkan perubahan Anda Gemfile
. Itu berarti mengubah dependensi ke versi persis baru di Gemfile
. Setelah menjalankan itu:
bundle install
Ini akan memperbarui Anda Gemfile.lock
dengan versi aplikasi terbaru Anda.
nokogiri ~> 1.4.4
tidak akan mengizinkan 1.5.3
untuk diinstal; Maks diizinkan akan ada di 1.4.x
mana x>=4
(untuk nokogiri itu 1.4.7
). The ~>
berarti Operator hanya angka terakhir di permata digunakan bisa "lebih besar dari" versi yang diberikan. Misalnya, foo ~> a.b.c.d
berarti versi apa pun foo
baik-baik saja selama masih abc {sesuatu} di mana {sesuatu} >=
d. Lihat juga pertanyaan terkait
gem "nokogiri", "~> 1.4.4"
di gemfile. Mengapa bundler tidak bisa menggunakan versi itu? Apakah karena dirancang secara sengaja untuk menginstal versi terbaru permata secara default?
~> 1.4.4
setara dengan >= 1.4.4 and < 1.5
. Lihat bundler.io/v1.5/gemfile.html . Untuk versi yang tepat, gunakan saja gem 'foo', '1.4.4'
.
bundle install
akan memeriksa Gemfile
bahkan jika ada Gemfile.lock
dan menegakkan pembatasan baru Gemfile.lock
?
The Gemfile.lock
Ketika Anda menjalankan bundle install, Bundler akan mempertahankan nama dan versi lengkap dari semua permata yang Anda gunakan (termasuk dependensi dari permata yang ditentukan dalam Gemfile (5)) ke dalam file bernama Gemfile.lock.
Bundler menggunakan file ini di semua panggilan berikutnya untuk menginstal bundel, yang menjamin bahwa Anda selalu menggunakan kode persis yang sama, bahkan ketika aplikasi Anda bergerak melintasi mesin.
Karena cara resolusi dependensi berfungsi, bahkan perubahan yang tampaknya kecil (misalnya, pembaruan ke titik-pelepasan dependensi permata di Gemfile Anda (5)) dapat mengakibatkan permata yang berbeda secara radikal diperlukan untuk memenuhi semua dependensi.
Akibatnya, Anda HARUS memeriksa Gemfile Anda. Buka kontrol versi. Jika tidak, setiap mesin yang memeriksa repositori Anda (termasuk server produksi Anda) akan menyelesaikan semua dependensi lagi, yang akan menghasilkan versi berbeda dari kode pihak ketiga yang digunakan jika ada permata di Gemfile (5) atau dependensi mereka telah diperbarui.
Gemfile.lock
termasuk versi 'terbuka' dalam beberapa kasus (misalnyarails (4.0.0)
membutuhkanbundler (>= 1.3.0, < 2.0)
), yang menyebabkan masalah. Adakah cara untuk menghindari ketergantungan 'terbuka' itu?