Gemfile.lock ควรรวมอยู่ใน. gignignore หรือไม่?


501

ฉันเป็นคนใหม่สำหรับบันเดิลและไฟล์ที่สร้างขึ้น ฉันมีสำเนา repo git จาก GitHub ที่หลายคนสนับสนุนดังนั้นฉันประหลาดใจที่พบว่า Bundler สร้างไฟล์ที่ไม่มีอยู่ใน repo และไม่อยู่ใน.gitignoreรายการ

เนื่องจากฉันได้แยกมันฉันรู้ว่าการเพิ่มลงใน repo จะไม่ทำลายอะไรสำหรับ repo หลัก แต่ถ้าฉันทำคำขอดึงมันจะทำให้เกิดปัญหาหรือไม่

ควรGemfile.lockรวมอยู่ในที่เก็บหรือไม่?


ที่เกี่ยวข้อง: stackoverflow.com/questions/14034561/…
ripper234

2
หากคุณพบวิธีที่นี่เพราะคุณมีกล่อง Linux และ Windows ที่แบ่งปัน repo เดียวกันดูคำตอบของ Joe Yang ในขณะที่ฉันเขียนนี้มันเป็นอันดับสาม ดูstackoverflow.com/questions/14034561/…
Peter Berg

คำตอบ:


549

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

จากความคิดเห็นของ Cowboycoded ด้านล่าง:

หากคุณกำลังทำงานกับอัญมณีแล้วอย่าตรวจสอบใน Gemfile.lock ของคุณ หากคุณกำลังใช้งานแอพ Rails อยู่ให้ตรวจสอบใน Gemfile.lock ของคุณ

นี่เป็นบทความที่ดีที่อธิบายว่าไฟล์ล็อคคืออะไร


88
ขึ้นอยู่กับสิ่งที่คุณกำลังทำงาน หากคุณกำลังทำงานกับอัญมณีแล้วอย่าตรวจสอบใน Gemfile.lock ของคุณ หากคุณกำลังใช้งานแอพ Rails อยู่ให้ตรวจสอบใน Gemfile.lock ของคุณ ข้อมูลเพิ่มเติมที่นี่ - yehudakatz.com/2010/12/16/…
johnmcaliley

ขอบคุณสำหรับบทความที่เป็นประโยชน์
ashisrai_

1
คุณควรใส่สิ่งที่ Cowboycoded พูดไว้ในคำตอบของคุณ: อัญมณี
aarona

ลิงค์บทความต้องการ href ใหม่
Ross

4
โปรดอย่าทำอย่างนั้น !! ทำให้ Gemfile.lock ของคุณอยู่ในตำแหน่งที่เหมาะสม! เช่นกล่าวว่าที่นี่และที่นี่
Ricardo Ruwer

50

ปัญหาที่แท้จริงเกิดขึ้นเมื่อคุณทำงานกับแอพ open-source Rails ซึ่งจำเป็นต้องมีอะแดปเตอร์ฐานข้อมูลที่กำหนดค่าได้ ฉันกำลังพัฒนา Fat Free CRM สาขา Rails 3 การตั้งค่าของฉันคือ postgres แต่เราต้องการให้ฐานข้อมูลเริ่มต้นเป็น mysql2

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

git update-index --assume-unchanged Gemfile.lock

และย้อนกลับ:

git update-index --no-assume-unchanged Gemfile.lock

Gemfileนอกจากนี้ยังเป็นประโยชน์ที่จะรวมถึงสิ่งที่ต้องการต่อไปนี้ในรหัสของคุณ สิ่งนี้จะทำการโหลดอะแดปเตอร์ฐานข้อมูลที่เหมาะสมโดยยึดตาม database.yml ของคุณ

# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2"     => ["mysql2", ">= 0.2.6"],
           "postgresql" => ["pg",     ">= 0.9.0"],
           "sqlite3"    => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
  db = YAML.load_file(db_config)
  # Fetch the first configured adapter from config/database.yml
  (db["production"] || db["development"] || db["test"])["adapter"]
else
  "mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------

ฉันไม่สามารถพูดได้ว่านี่เป็นการฝึกฝนที่ดีที่สุดหรือไม่ แต่มันก็ใช้ได้ดีสำหรับฉัน


2
ข้อมูลที่มีประโยชน์มาก ... ไม่แน่ใจว่าทำไมคุณถึงได้แค่ 3 คะแนนและคำตอบที่มีประโยชน์น้อยกว่านั้นคือ 50 คะแนน อ๋อใช่ดู datestamps (หนึ่งในความล้มเหลวที่ยิ่งใหญ่ของ SO คือผลประโยชน์ที่ไม่สมส่วนที่เกิดขึ้นในการตอบในไม่ช้าหลังจากคำถามถูกถาม)
iconoclast

1
@iconoclast: ฉันดีใจที่คุณโพสต์สิ่งที่คุณทำ ฉันคิดว่าหลาย ๆ คนที่มาที่โพสต์นี้รวมอยู่ด้วยตัวเองถูก "ตาบอด" โดยชื่อคำถาม ตอนนี้ฉันรู้แล้วว่าคำตอบของฉันตอบเฉพาะกรณีใช้งานเฉพาะและไม่จำเป็นต้องเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้ ฉันจะทำงานเพื่ออัปเดตในอนาคตอันใกล้ ที่กล่าวว่า OP ไม่ควรทำเครื่องหมายคำตอบของฉันว่าถูกต้องหากไม่สอดคล้องกับความต้องการของเขา / เธอ
rwilliams

34

เพื่อนร่วมงานของฉันและฉันมี Gemfile.lock ที่แตกต่างกันเพราะเราใช้แพลตฟอร์ม windows และ mac ที่แตกต่างกันและเซิร์ฟเวอร์ของเราคือ linux

เราตัดสินใจที่จะลบ Gemfile.lock ใน repo และสร้าง Gemfile.lock.server ใน git repo เหมือนกับ database.yml จากนั้นก่อนที่จะปรับใช้บนเซิร์ฟเวอร์เราคัดลอก Gemfile.lock.server ไปยัง Gemfile.lock บนเซิร์ฟเวอร์โดยใช้ cap deploy hook


5
ฉันมีแอพที่ฉันพัฒนาใน OSX และต้องปรับใช้บนเซิร์ฟเวอร์ Windows การติดตาม Gemfile.lock ด้วย git พิสูจน์แล้วว่าเป็นความคิดที่ไม่ดีดังนั้นมันจึงไปในไฟล์. gitignore ของฉัน อัญมณีจำนวนมากต้องการเวอร์ชันที่แตกต่างกันสำหรับสภาพแวดล้อมที่แตกต่างกัน เป็นการดีที่คุณควรหลีกเลี่ยงการเคยอยู่ในสถานการณ์เช่นนี้ แต่ฉันไม่มีทางเลือก (ด่าคุณแผนกไอที!)
แบรด

11

เห็นด้วยกับ r-dub เก็บไว้ในการควบคุมแหล่ง แต่สำหรับฉันประโยชน์ที่แท้จริงคือ:

การทำงานร่วมกันในสภาพแวดล้อมที่เหมือนกัน (ไม่สนใจสิ่งที่ windohs และ linux / mac) ก่อน Gemfile.lock เพื่อนคนต่อไปที่จะติดตั้งโครงการอาจเห็นข้อผิดพลาดที่ทำให้เกิดความสับสนทุกชนิดโทษตัวเอง แต่เขาเป็นคนโชคดีที่ได้รับ Super gem เวอร์ชั่นใหม่ทำลายการพึ่งพาที่มีอยู่

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

หมายเหตุ: อย่าลืมจัดกลุ่มสิ่งของเช่น: development and: test


11

เอกสาร Bundler ตอบคำถามนี้เช่นกัน:

เดิม: http://gembundler.com/v1.3/rationale.html

แก้ไข: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

ดูส่วนที่เรียกว่า "การตรวจสอบรหัสของคุณลงในการควบคุมเวอร์ชัน":

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

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

ครั้งต่อไปที่คุณเรียกใช้การติดตั้งแบบมัดบนเครื่องเดียวกัน Bundler จะเห็นว่ามันมีการอ้างอิงทั้งหมดที่คุณต้องการอยู่แล้วและข้ามกระบวนการติดตั้ง

อย่าตรวจสอบในไดเรกทอรี. bundle หรือไฟล์ใด ๆ ข้างใน ไฟล์เหล่านั้นเป็นไฟล์เฉพาะสำหรับแต่ละเครื่องโดยเฉพาะและจะใช้เพื่อรักษาการเลือกการติดตั้งระหว่างการรันคำสั่งการติดตั้งบันเดิล

หากคุณใช้ชุดบันเดิล, อัญมณี (แม้ว่าจะไม่ใช่อัญมณีคอมไพล์) ที่ชุดข้อมูลของคุณต้องการจะถูกดาวน์โหลดไปยังผู้ขาย / แคช Bundler สามารถทำงานได้โดยไม่ต้องเชื่อมต่อกับอินเทอร์เน็ต (หรือเซิร์ฟเวอร์ RubyGems) หากอัญมณีทั้งหมดที่คุณต้องการมีอยู่ในโฟลเดอร์นั้นและเช็คอินกับแหล่งควบคุมของคุณ นี่เป็นขั้นตอนที่เป็นทางเลือกและไม่แนะนำเนื่องจากการเพิ่มขนาดของที่เก็บคอนโทรลแหล่งที่มาของคุณ


4

ไม่มี Gemfile.lock หมายความว่า:

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

-> ตรวจสอบใน Gemfile.lock เสมอลบเทรวิสหากคุณต้องการละเอียดอย่างละเอียดhttps://grosser.it/2015/08/14/check-in-your-gemfile-lock/


3

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

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

หากGemfile.lockมีการเปลี่ยนแปลงในเครื่องผลิตของคุณและ Git ไม่ให้คุณgit pullคุณควรเขียนgit reset --hardเพื่อหลีกเลี่ยงการเปลี่ยนแปลงไฟล์นั้นและเขียนgit pullอีกครั้ง


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