Apa perbedaan antara Gemfile dan Gemfile.lock di Ruby on Rails


Jawaban:


159

Di Gemfilesinilah Anda menentukan permata mana yang ingin Anda gunakan, dan memungkinkan Anda menentukan versi mana.

The Gemfile.lockfile mana Bundler mencatat versi yang tepat yang dipasang. Dengan cara ini, ketika pustaka / proyek yang sama dimuat pada komputer lain, menjalankan bundle installakan melihat Gemfile.lockdan menginstal versi yang sama persis, daripada hanya menggunakan Gemfiledan 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.


2
Bahwa ini bagaimana harus bekerja - tapi rupanya Gemfile.locktermasuk versi 'terbuka' dalam beberapa kasus (misalnya rails (4.0.0)membutuhkan bundler (>= 1.3.0, < 2.0)), yang menyebabkan masalah. Adakah cara untuk menghindari ketergantungan 'terbuka' itu?
Guillermo Grau

158

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).

Apa artinya ?

Seperti yang Anda lihat jika Anda tidak memiliki Gemfile.lockdan 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.lockini digunakan. Dalam Gemfile.lockhanya 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.

Bagaimana Gemfile.lock dibuat?

Secara otomatis dibuat dengan yang pertama:

bundle install

perintah. Setelah itu setiap kali Anda menjalankan bundle install, bundel pertama-tama akan mencari Gemfile.lockdan menginstal permata yang ditentukan di sana. Merupakan kebiasaan untuk mendistribusikan file ini di antara proyek Anda untuk memberikan secara konsisten dan stabilitas.

Bagaimana cara memperbarui Gemfile.lock?

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.lockdengan versi aplikasi terbaru Anda.


19
Deskripsi yang sangat bagus dan jelas (saya dipilih); tetapi satu nitpick, bagaimanapun: nokogiri ~> 1.4.4tidak akan mengizinkan 1.5.3untuk diinstal; Maks diizinkan akan ada di 1.4.xmana 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.dberarti versi apa pun foobaik-baik saja selama masih abc {sesuatu} di mana {sesuatu} >=d. Lihat juga pertanyaan terkait
michael

1
Yang membingungkan saya adalah bahwa Anda sudah menentukan versi tertentu dengan menggunakan 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?
Jonny

@Jonny, lihat komentar michael_n. ~> 1.4.4 tidak menentukan versi pastinya.
Matthew Flaschen

2
@ Jonny, ~> 1.4.4setara 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'.
Matthew Flaschen

1
Jawaban yang bagus tapi tolong jelaskan " perbarui Gemfile.lock? ": Apakah bagian ini mengatakan bahwa bundle installakan memeriksa Gemfilebahkan jika ada Gemfile.lockdan menegakkan pembatasan baru Gemfile.lock?
JMess

4

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.