ทำความเข้าใจกับไฟล์ Gemfile.lock


181

หลังจากเรียกใช้bundle installคำสั่ง'Gemfile.lock ' จะถูกสร้างขึ้นในไดเรกทอรีการทำงาน คำสั่งภายในไฟล์นั้นหมายถึงอะไร?

ตัวอย่างเช่นลองใช้ไฟล์ต่อไปนี้:

PATH
  remote: .
  specs:
    gem_one (0.0.1)

GEM
  remote: http://example.org/
  specs:
    gem_two (0.0.2)
    gem_three (0.0.3)
      gem_four (0.0.4)

PLATFORMS
  platform

DEPENDENCIES
  gem_two
  gem_one!

' PATH ', ' GEM ', ' PLATFORMS ' และ ' DEPENDENCIES ' หมายถึงอะไร? จำเป็นต้องใช้ทั้งหมดหรือไม่

สิ่งที่ควรมีไดเรกทอรีย่อย' remote ' และ ' spec '

เครื่องหมายอัศเจรีย์หลังชื่ออัญมณีในกลุ่ม ' DEPENDENCIES ' หมายถึงอะไร

คำตอบ:


71

คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับมันได้ในเว็บไซต์ของบันเดิล (เน้นที่ด้านล่างเพื่อความสะดวกของคุณ):

หลังจากพัฒนาแอปพลิเคชั่นของคุณสักพักให้เช็คอินแอพพลิเคชั่นพร้อมกับสแน็ปช็อตGemfileและGemfile.lock ตอนนี้ที่เก็บของคุณมีการบันทึกเวอร์ชันที่แน่นอนของอัญมณีทั้งหมดที่คุณใช้ครั้งล่าสุดที่คุณทราบแน่นอนว่าแอปพลิเคชันทำงาน ...

สิ่งนี้มีความสำคัญ: Gemfile.lockทำให้แอปพลิเคชันของคุณเป็นแพคเกจเดียวของรหัสของคุณและรหัสของบุคคลที่สามซึ่งรันในครั้งสุดท้ายที่คุณรู้ว่าทุกอย่างทำงานได้ดี การระบุเวอร์ชันที่แน่นอนของรหัสของบุคคลที่สามที่คุณพึ่งพาใน Gemfile ของคุณจะไม่ให้การรับประกันแบบเดียวกันเพราะโดยปกติแล้วอัญมณีจะประกาศช่วงของเวอร์ชันสำหรับการอ้างอิงของพวกเขา


65
นี่ไม่ได้ตอบคำถามใด ๆ ของเขาเขาถามเกี่ยวกับรูปแบบของ Gemfile.lock แต่เพียงอธิบายสิ่งที่มันทำ
Joshua Cheek

38

เกี่ยวกับเครื่องหมายอัศเจรีย์ที่ฉันเพิ่งพบว่ามันเป็นอัญมณีที่เรียกผ่าน:gitเช่น

gem "foo", :git => "git@github.com:company/foo.git"

ว้าวงานที่ดีในการหาสิ่งนั้นฉันก็สงสัยเช่นกัน ขอบคุณ
JP Silvashy

5
นอกจากนี้ยังเกิดขึ้นเมื่อโหลดอัญมณีท้องถิ่นผ่านpathตัวเลือก ฉันเดาว่ามีบางอย่างเกี่ยวข้องกับการโหลดอัญมณีที่ไม่ได้รวบรวม
zykadelic

ใช่นี่คือเหตุผล แต่นี่ไม่ใช่เหตุผลเดียวที่อัญมณีจะถูกทำเครื่องหมายด้วยเครื่องหมายอัศเจรีย์ ขณะนี้ฉันเห็นอัญมณีที่ประกาศอยู่ในบล็อกแหล่งที่มาว่ามีเครื่องหมายอัศเจรีย์
Sean Moubry

35

ฉันได้ใช้เวลาไม่กี่เดือนที่ผ่านมา messing รอบด้วย Gemfiles และ Gemfile.locks มากในขณะที่การสร้างเครื่องมือการปรับปรุงการพึ่งพาอัตโนมัติ1 ด้านล่างอยู่ไกลจากขั้นสุดท้าย แต่เป็นจุดเริ่มต้นที่ดีสำหรับการทำความเข้าใจรูปแบบ Gemfile.lock นอกจากนี้คุณยังอาจต้องการตรวจสอบรหัสที่มาสำหรับ Bundler ของparser แฟ้มล็อค

คุณจะพบหัวข้อต่อไปนี้ใน lockfile ที่สร้างโดย Bundler 1.x:

GEM (เป็นทางเลือก แต่เป็นเรื่องธรรมดามาก)

สิ่งเหล่านี้เป็นการอ้างอิงที่มาจากเซิร์ฟเวอร์ Rubygems นั่นอาจเป็นดัชนี Rubygems หลักที่ Rubygems.org หรืออาจเป็นดัชนีที่กำหนดเองเช่นดัชนีจาก Gemfury และอื่น ๆ ภายในส่วนนี้คุณจะเห็น:

  • remote: มีหนึ่งบรรทัดขึ้นไปที่ระบุตำแหน่งของดัชนี Rubygems
  • specs: รายการของการอ้างอิงพร้อมกับหมายเลขรุ่นของพวกเขาและข้อ จำกัด ในการพึ่งพาใด ๆ

GIT (เป็นทางเลือก)

สิ่งเหล่านี้เป็นการอ้างอิงที่มาจากรีโมต git ที่กำหนด คุณจะเห็นส่วนต่าง ๆ เหล่านี้สำหรับแต่ละรีโมตคอมไพล์และภายในแต่ละส่วนคุณจะเห็น:

  • remote:รีโมทคอมไพล์ เช่น,git@github.com:rails/rails
  • revision: การคอมมิตอ้างอิง Gemfile.lock ถูกล็อคไว้
  • tag: (ทางเลือก) แท็กที่ระบุใน Gemfile
  • specs: การพึ่งพา git ที่พบที่รีโมตนี้พร้อมกับหมายเลขเวอร์ชันและข้อ จำกัด ของการพึ่งพาใด ๆ

เส้นทาง (ไม่จำเป็น)

เหล่านี้คือการอ้างอิงที่มาจากที่กำหนดไว้pathใน Gemfile คุณจะเห็นส่วนที่แตกต่างของส่วนเหล่านี้สำหรับการอ้างอิงแต่ละเส้นทางและภายในแต่ละส่วนคุณจะเห็น:

  • remote:เส้นทาง. เช่น,plugins/vendored-dependency
  • specs: การพึ่งพา git ที่พบที่รีโมตนี้พร้อมกับหมายเลขเวอร์ชันและข้อ จำกัด ของการพึ่งพาใด ๆ

แพลตฟอร์ม

แพลตฟอร์ม Ruby ที่ Gemfile.lock ถูกสร้างขึ้น หากการอ้างอิงใด ๆ ใน Gemfile ระบุแพลตฟอร์มดังนั้นพวกเขาจะรวมอยู่ใน Gemfile.lock เมื่อล็อคไฟล์ถูกสร้างขึ้นบนแพลตฟอร์มนั้น (เช่นผ่านการติดตั้ง)

DEPENDENCIES

รายการของการขึ้นต่อกันที่ระบุไว้ในGemfile, พร้อมกับข้อ จำกัด เวอร์ชันที่ระบุไว้ที่นั่น

การอ้างอิงที่ระบุพร้อมกับแหล่งอื่นนอกเหนือจากดัชนี Rubygems หลัก (เช่นการอ้างอิง git, การอ้างอิงพา ธ , การอ้างอิง) มี!วิธีการที่พวกเขาจะ "ตรึง" ไปยังแหล่งที่2 (แม้ว่าบางครั้งต้องดูใน Gemfile เพื่อกำหนด)

รุ่น RUBY (ไม่บังคับ)

เวอร์ชัน Ruby ที่ระบุใน Gemfile เมื่อ Gemfile.lock นี้ถูกสร้างขึ้น หากระบุรุ่นทับทิมใน.ruby_versionไฟล์แทนส่วนนี้จะไม่ปรากฏ (เนื่องจาก Bundler จะพิจารณา Gemfile / Gemfile.lock ไม่เชื่อเรื่องพระเจ้ากับรุ่น Ruby ของโปรแกรมติดตั้ง)

ผสานกับ (Bundler> = v1.10.x)

เวอร์ชันของ Bundler ใช้เพื่อสร้าง Gemfile.lock ใช้เพื่อเตือนให้ผู้ติดตั้งอัปเดต Bundler เวอร์ชันหากเวอร์ชันเก่ากว่าที่สร้างไฟล์

แหล่งปลั๊กอิน (ตัวเลือกและหายากมาก)

ในทางทฤษฎี Gemfile สามารถระบุปลั๊กอิน Bundler ได้เช่นเดียวกับอัญมณี3ซึ่งจะแสดงอยู่ที่นี่ ในทางปฏิบัติฉันไม่ทราบว่ามีปลั๊กอินใดบ้างตั้งแต่เดือนกรกฎาคม 2017 ส่วนหนึ่งของ Bundler นี้ยังอยู่ในระหว่างการพัฒนา!


  1. https://dependabot.com
  2. https://github.com/bundler/bundler/issues/4631
  3. http://andre.arko.net/2012/07/23/towards-a-bundler-plugin-system/

2
น่าจะเป็นคำตอบที่ดีที่สุด
daslicious

9

Bundler เป็นผู้จัดการของ Gem ซึ่งให้สภาพแวดล้อมที่สอดคล้องกันสำหรับโครงการ Ruby โดยการติดตามและติดตั้งอัญมณีและเวอร์ชันที่ต้องการ

Gemfile และ Gemfile.lock เป็นผลิตภัณฑ์หลักที่ได้รับจาก Bundler gem (Bundler นั้นเป็นอัญมณี)

Gemfile มีการพึ่งพาโครงการของคุณใน gem (s) ที่คุณพูดถึงด้วยตนเองระบุรุ่น (s) ระบุ แต่ intunes อัญมณี (s) เหล่านั้นขึ้นอยู่กับอัญมณีอื่น ๆ ซึ่งแก้ไขได้โดย bundler

Gemfile.lock มีสแนปชอตที่สมบูรณ์ของอัญมณีทั้งหมดใน Gemfile พร้อมกับการพึ่งพาที่เกี่ยวข้อง

เมื่อคุณติดตั้งบันเดิลครั้งแรกมันจะสร้าง Gemfile.lock นี้และใช้ไฟล์นี้ในการโทรตามลำดับทั้งหมดเพื่อติดตั้งบันเดิลซึ่งทำให้มั่นใจได้ว่าคุณมีการติดตั้งการอ้างอิงทั้งหมดและจะข้ามการติดตั้งการพึ่งพา

จะเกิดขึ้นเช่นเดียวกันเมื่อคุณแชร์รหัสกับเครื่องอื่น

คุณแชร์ Gemfile.lock ของคุณพร้อมกับ Gemfile เมื่อคุณรันบันเดิลการติดตั้งบนเครื่องอื่นมันจะอ้างถึง Gemfile.lock ของคุณและข้ามขั้นตอนการแก้ปัญหาการพึ่งพา แต่จะติดตั้งพลอยที่ขึ้นอยู่กับที่คุณใช้บน เครื่องดั้งเดิมซึ่งมีความสอดคล้องกันในหลาย ๆ เครื่อง

ทำไมเราต้องรักษาความสม่ำเสมอในหลาย ๆ เครื่อง?

  • การใช้เวอร์ชั่นที่แตกต่างกันในเครื่องที่แตกต่างกันอาจทำให้รหัสเสีย

  • สมมติว่าแอปของคุณใช้เวอร์ชัน 1.5.3 และใช้งานได้ 14 เดือนที่ผ่านมา
    โดยไม่มีปัญหาใด ๆ และคุณพยายามติดตั้งบนเครื่องอื่น
    โดยไม่ใช้ Gemfile.lock ตอนนี้คุณจะได้รับเวอร์ชัน 1.5.8 อาจมีบางเวอร์ชันที่ใช้งานไม่ได้กับอัญมณีรุ่นล่าสุดและแอปพลิเคชันของคุณจะ
    ล้มเหลว การรักษาความมั่นคงมีความสำคัญสูงสุด (
    การปฏิบัติที่ต้องการ)

นอกจากนี้ยังเป็นไปได้ที่จะอัปเดตอัญมณีใน Gemfile.lock โดยใช้การ อัปเดตบันเดิ

สิ่งนี้ขึ้นอยู่กับแนวคิดของการปรับปรุงแบบอนุรักษ์นิยม


8

ดูเหมือนว่า PATH จะแสดงรายการการพึ่งพารุ่นที่หนึ่งโดยตรงจาก Gemspec ของคุณในขณะที่ GEM จะแสดงรายการการพึ่งพาในรุ่นที่สอง (เช่นการพึ่งพาของคุณขึ้นอยู่กับ) และจาก Gemfile ของคุณ PATH :: remote เป็น.เพราะมันอาศัย localspecspec ในไดเรกทอรีปัจจุบันเพื่อค้นหาสิ่งที่อยู่ใน PATH :: spec ในขณะที่ GEM :: remote คือrubygems.orgเนื่องจากว่าเป็นที่ที่มันต้องไปหาสิ่งที่อยู่ใน GEM :: ข้อมูลจำเพาะ

ในปลั๊กอิน Rails คุณจะเห็นส่วน PATH แต่ไม่ใช่ในแอพ Rails เนื่องจากแอพไม่มีไฟล์ gemspec จึงไม่มีอะไรให้ใส่ใน PATH

สำหรับ DEPENDENCIES, gembundler.comระบุว่า:

Runtime dependencies in your gemspec are treated like base dependencies, 
and development dependencies are added by default to the group, :development

Gemfile ที่สร้างโดยrails plugin new my_pluginพูดว่าคล้ายกัน:

# Bundler will treat runtime dependencies like base dependencies, and
# development dependencies will be added by default to the :development group.

สิ่งนี้หมายความว่าอะไรคือความแตกต่างระหว่าง

s.add_development_dependency "july" # (1)

และ

s.add_dependency "july" # (2)

คือ (1) จะรวมเฉพาะ "กรกฎาคม" ใน Gemfile.lock (ดังนั้นในแอปพลิเคชัน) ในสภาพแวดล้อมการพัฒนา ดังนั้นเมื่อคุณเรียกใช้bundle installคุณจะเห็น "กรกฏาคม" ไม่เพียง แต่ภายใต้ PATH แต่ยังอยู่ภายใต้ DEPENDENCIES แต่ในการพัฒนาเท่านั้น ในการผลิตมันจะไม่อยู่ที่นั่นเลย อย่างไรก็ตามเมื่อคุณใช้ (2) คุณจะเห็น "กรกฎาคม" เฉพาะใน PATH ไม่ใช่ใน DEPENDENCIES แต่จะปรากฏขึ้นเมื่อคุณbundle installจากสภาพแวดล้อมการผลิต (เช่นในอัญมณีอื่น ๆ ที่มีการพึ่งพาของคุณ) ไม่ใช่ การพัฒนาเท่านั้น

นี่เป็นเพียงข้อสังเกตของฉันและฉันไม่สามารถอธิบายได้อย่างเต็มที่ว่าทำไมสิ่งนี้ถึงเป็นอย่างนั้น แต่ฉันยินดีรับฟังความคิดเห็นเพิ่มเติม


3

ดูเหมือนว่าไม่มีเอกสารที่ชัดเจนเกี่ยวกับGemfile.lockรูปแบบ อาจเป็นเพราะGemfile.lockมีการใช้งานโดยชุดข้อมูลภายในเท่านั้น

อย่างไรก็ตามเนื่องจากGemfile.lockเป็นสแน็ปช็อตGemfileซึ่งหมายความว่าข้อมูลทั้งหมดควรมาจากGemfile(หรือจากค่าเริ่มต้นหากไม่ได้ระบุไว้Gemfile)

สำหรับมันแสดงรายการอ้างอิงทั้งหมดที่คุณแนะนำโดยตรงหรือโดยอ้อมในGEM ภายใต้การบอกว่าจะได้รับอัญมณีซึ่งถูกระบุโดยแหล่งที่มาในGemfileremoteGEMGemfile

ถ้าอัญมณีไม่ถูกดึงออกมาremoteให้PATHบอกที่ตั้งเพื่อค้นหามัน PATHข้อมูล 's มาจากเส้นทางในGemfileเมื่อคุณประกาศพึ่งพา

และPLATFORMอยู่ห่างจากที่นี่

สำหรับDEPENDENCIESมันเป็นภาพรวมของการอ้างอิงที่แก้ไขโดยชุด


0

เครื่องหมายอัศเจรีย์หลังชื่ออัญมณีในกลุ่ม 'DEPENDECIES' หมายถึงอะไร

เครื่องหมายอัศเจรีย์ปรากฏขึ้นเมื่อติดตั้ง gem โดยใช้แหล่งอื่นนอกเหนือจาก " https://rubygems.org "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.