ฉันเป็นมือใหม่ของ Ruby on Rails และฉันใช้ Rails 3.0.9
ความแตกต่างระหว่างGemfile
และGemfile.lock
ใน Rails คืออะไร?
ฉันเป็นมือใหม่ของ Ruby on Rails และฉันใช้ Rails 3.0.9
ความแตกต่างระหว่างGemfile
และGemfile.lock
ใน Rails คืออะไร?
คำตอบ:
Gemfile
เป็นที่ที่คุณระบุอัญมณีที่คุณต้องการใช้งานและช่วยให้คุณสามารถระบุรุ่น
Gemfile.lock
ไฟล์ที่บันทึก Bundler รุ่นที่แน่นอนที่มีการติดตั้ง วิธีนี้เมื่อโหลดไลบรารี / โปรเจ็กต์เดียวกันบนเครื่องอื่นการรันbundle install
จะดูGemfile.lock
และติดตั้งเวอร์ชันเดียวกันทั้งหมดแทนที่จะใช้Gemfile
และติดตั้งเวอร์ชันล่าสุดเท่านั้น (การเรียกใช้เวอร์ชันต่างๆบนเครื่องที่แตกต่างกันอาจทำให้การทดสอบเสียหาย ฯลฯ ) คุณไม่ควรแก้ไขไฟล์ล็อกโดยตรง
ตรวจสอบวัตถุประสงค์และเหตุผลของ Bundlerโดยเฉพาะในส่วนการตรวจสอบโค้ดของคุณในการควบคุมเวอร์ชัน
โดยปกติเราจะเขียนการอ้างอิงใน Gemfile เป็น:
gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..
โดยพื้นฐานแล้วคุณพูดว่า: " ฉันต้องการ nokogiri ตราบใดที่มันมากกว่าเวอร์ชัน 1.4.4 " ฯลฯ สมมติว่าฉันได้ตั้งค่าเมื่อGemfile
8 เดือนที่แล้วและฉันตั้งค่าแอปของฉันได้สำเร็จตามข้อกำหนดนี้ 8 เดือนที่ผ่านมารุ่น nokogiri เป็น1.4.4 แอปรางของฉันทำงานได้อย่างสมบูรณ์โดยไม่มีปัญหากับเวอร์ชันนี้
Gemfile
ตอนนี้คิดว่าฉันพยายามที่จะสร้างด้วยเหมือนกัน แต่ถ้าเราดูรุ่น nokogiriเราจะเห็นว่าเวอร์ชันเสถียรในปัจจุบันเปลี่ยนเป็น1.4.9แล้ว นั่นหมายความว่าหากเราพยายามสร้างบันเดิลเลอร์จะติดตั้ง nokogiri เวอร์ชัน1.4.9 (สมมติว่าเราไม่มีGemfile.lock
)
อย่างที่คุณเห็นว่าคุณไม่มีGemfile.lock
และเรียกใช้:
bundle install
แล้วอัญมณีที่ใช้อยู่ในปัจจุบันจะแตกต่างกันในเวลาใดก็ได้ แอปของคุณใช้เวอร์ชั่น1.4.4และการทำงาน8 เดือนที่ผ่านมาไม่มีปัญหาใด ๆ แต่ถ้าคุณพยายามที่จะสร้างมันขึ้นมาตอนนี้คุณจะได้รับรุ่น1.4.9 อาจจะเสียด้วยเวอร์ชันล่าสุดnokogiri
ฟีเจอร์ที่ยอดเยี่ยมที่คุณใช้กับ1.4.4ไม่มีให้ใช้งานอีกแล้ว ฯลฯ ..
เพื่อป้องกันปัญหาประเภทGemfile.lock
นี้ใช้ ในGemfile.lock
เฉพาะรุ่นที่แน่นอนจะถูกเขียนและทำให้เหล่านี้เท่านั้นจะถูกติดตั้ง นั่นหมายความว่าถ้าคุณจัดจำหน่ายแอปของคุณด้วยGemfile.lock
เครื่องทุกคนจะมีอัญมณีเดียวกันการติดตั้งและที่สำคัญที่สุดที่พวกเขาทั้งหมดได้รับรุ่นเดียวกัน สิ่งนี้จะทำให้คุณมีสแต็กการปรับใช้ที่มีเสถียรภาพ
มันถูกสร้างขึ้นโดยอัตโนมัติด้วยสิ่งแรก:
bundle install
คำสั่ง หลังจากนั้นทุกครั้งที่คุณเรียกใช้bundle install
บันเดิลจะค้นหาGemfile.lock
และติดตั้งอัญมณีที่ระบุไว้ในนั้นก่อน เป็นนิสัยที่จะแจกจ่ายไฟล์นี้ในโครงการของคุณเพื่อให้มีความมั่นคงและสม่ำเสมอ
หากคุณพอใจกับแอปเวอร์ชันล่าสุดเกินกว่าที่จะอัปเดตGemfile.lock
ได้ Gemfile
เพียงแค่สะท้อนให้เห็นถึงการเปลี่ยนแปลงของคุณ นั่นหมายถึงเปลี่ยนการอ้างอิงเป็นเวอร์ชันที่แน่นอนใหม่ในGemfile
. หลังจากนั้นให้รัน:
bundle install
การดำเนินการนี้จะอัปเดตคุณGemfile.lock
ด้วยแอปเวอร์ชันใหม่ล่าสุด
nokogiri ~> 1.4.4
ไม่อนุญาตให้1.5.3
ติดตั้ง อนุญาตสูงสุดจะอยู่1.4.x
ที่x>=4
(สำหรับ nokogiri ที่จะเป็น1.4.7
) ตัว~>
ดำเนินการหมายถึงตัวเลขสุดท้ายในอัญมณีที่ใช้สามารถ "มากกว่า" เวอร์ชันที่กำหนดได้ เช่นfoo ~> a.b.c.d
หมายความว่าเวอร์ชันใด ๆfoo
ก็ใช้ได้ตราบเท่าที่ยังคงเป็น abc {something} ที่ {something} >=
d ดูคำถามที่เกี่ยวข้องด้วย
gem "nokogiri", "~> 1.4.4"
ใน gemfile เหตุใดบันเดิลเลอร์จึงใช้เวอร์ชันนั้นไม่ได้ เป็นเพราะได้รับการออกแบบมาเพื่อจงใจติดตั้งอัญมณีเวอร์ชันล่าสุดตามค่าเริ่มต้นหรือไม่?
~> 1.4.4
นี่เทียบเท่ากับ>= 1.4.4 and < 1.5
. ดูbundler.io/v1.5/gemfile.html gem 'foo', '1.4.4'
สำหรับรุ่นที่แน่นอนเพียงแค่ใช้
bundle install
จะตรวจสอบGemfile
แม้ว่าจะมีGemfile.lock
และบังคับใช้ข้อ จำกัด ใหม่Gemfile.lock
หรือไม่?
Gemfile.lock
เมื่อคุณเรียกใช้การติดตั้งบันเดิล Bundler จะคงชื่อเต็มและเวอร์ชันของอัญมณีทั้งหมดที่คุณใช้ (รวมถึงการอ้างอิงของอัญมณีที่ระบุใน Gemfile (5)) ไว้ในไฟล์ชื่อ Gemfile.lock
Bundler ใช้ไฟล์นี้ในการเรียกถัดไปทั้งหมดเพื่อติดตั้งบันเดิลซึ่งรับประกันว่าคุณจะใช้รหัสเดียวกันเสมอแม้ว่าแอปพลิเคชันของคุณจะย้ายไปตามเครื่องต่างๆ
เนื่องจากวิธีการแก้ปัญหาการพึ่งพาใช้งานได้แม้จะดูเหมือนการเปลี่ยนแปลงเล็กน้อย (ตัวอย่างเช่นการอัปเดตจุดปล่อยการพึ่งพาอัญมณีใน Gemfile ของคุณ (5)) อาจส่งผลให้อัญมณีที่แตกต่างกันอย่างสิ้นเชิงจึงจำเป็นเพื่อตอบสนองการพึ่งพาทั้งหมด
ดังนั้นคุณควรตรวจสอบ Gemfile.lock ของคุณในการควบคุมเวอร์ชัน หากคุณไม่ทำเช่นนั้นทุกเครื่องที่ตรวจสอบที่เก็บของคุณ (รวมถึงเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ) จะแก้ไขการอ้างอิงทั้งหมดอีกครั้งซึ่งจะส่งผลให้มีการใช้รหัสของบุคคลที่สามเวอร์ชันต่างๆหากมีอัญมณีใด ๆ ใน Gemfile (5) หรือใด ๆ อัปเดตการอ้างอิงของพวกเขาแล้ว
Gemfile.lock
รวมถึง 'เปิด' รุ่นในบางกรณี (เช่นrails (4.0.0)
ต้องbundler (>= 1.3.0, < 2.0)
) ซึ่งทำให้เกิดปัญหา มีความคิดอย่างไรที่จะหลีกเลี่ยงการพึ่งพา 'เปิด' เหล่านั้น?