Saya seorang pemula untuk Ruby on Rails dan saya menggunakan Rails 3.0.9.
Apa perbedaan antara Gemfile
dan Gemfile.lock
di Rails?
sumber
Saya seorang pemula untuk Ruby on Rails dan saya menggunakan Rails 3.0.9.
Apa perbedaan antara Gemfile
dan Gemfile.lock
di Rails?
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.
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?Biasanya kami menulis dependensi di Gemfile sebagai:
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 punyaGemfile.lock
).Apa artinya ?
Seperti yang Anda lihat jika Anda tidak memiliki
Gemfile.lock
dan menjalankan: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. DalamGemfile.lock
hanya versi yang tepat ditulis dan dengan demikian hanya ini akan dipasang. Itu berarti jika Anda mendistribusikan aplikasi Anda denganGemfile.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:
perintah. Setelah itu setiap kali Anda menjalankan
bundle install
, bundel pertama-tama akan mencariGemfile.lock
dan 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 AndaGemfile
. Itu berarti mengubah dependensi ke versi persis baru diGemfile
. Setelah menjalankan itu:Ini akan memperbarui Anda
Gemfile.lock
dengan versi aplikasi terbaru Anda.sumber
nokogiri ~> 1.4.4
tidak akan mengizinkan1.5.3
untuk diinstal; Maks diizinkan akan ada di1.4.x
manax>=4
(untuk nokogiri itu1.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 punfoo
baik-baik saja selama masih abc {sesuatu} di mana {sesuatu}>=
d. Lihat juga pertanyaan terkaitgem "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 sajagem 'foo', '1.4.4'
.bundle install
akan memeriksaGemfile
bahkan jika adaGemfile.lock
dan menegakkan pembatasan baruGemfile.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.
sumber