Gemfile.lock को .gitignore में शामिल किया जाना चाहिए?


500

मैं बंडल करने के लिए नया हूँ और यह उत्पन्न करने वाली फाइलें। मेरे पास GitHub से एक git repo की एक प्रति है जो कई लोगों द्वारा योगदान दिया जा रहा है इसलिए मुझे यह जानकर आश्चर्य हुआ कि बंडल ने एक फाइल बनाई जो रेपो में मौजूद नहीं थी और .gitignoreसूची में नहीं थी ।

जब से मैंने इसे कांटा है, मुझे पता है कि इसे रेपो में जोड़ना मुख्य रेपो के लिए कुछ भी नहीं तोड़ देगा, लेकिन अगर मैं एक पुल अनुरोध करता हूं, तो क्या यह एक समस्या पैदा करेगा?

Gemfile.lockरिपॉजिटरी में शामिल किया जाना चाहिए?



2
यदि आपको यहां अपना रास्ता मिल गया है क्योंकि आपके पास एक ही रेपो साझा करने वाले लिनक्स और विंडोज बॉक्स हैं, तो जो यांग का जवाब देखें। मेरे लेखन के समय यह तीसरे स्थान पर है। इसके अलावा stackoverflow.com/questions/14034561/…
पीटर बर्ग

जवाबों:


549

मान लें कि आप एक रूबीम नहीं लिख रहे हैं, Gemfile.lock आपके भंडार में होना चाहिए। इसका उपयोग आपके सभी आवश्यक रत्नों और उनकी निर्भरताओं के स्नैपशॉट के रूप में किया जाता है। इस तरह से बंडलर को हर बार आपके द्वारा तैनात किए जाने पर सभी मणि निर्भरताओं को पुनर्गणना नहीं करना पड़ता है, आदि।

नीचे चरवाहे की टिप्पणी से:

यदि आप एक मणि पर काम कर रहे हैं, तो अपने Gemfile.lock में जांच न करें। यदि आप एक रेल एप्लिकेशन पर काम कर रहे हैं, तो अपने Gemfile.lock में जांच करें।

यहाँ एक अच्छा लेख बताया गया है कि लॉक फ़ाइल क्या है।


88
इस पर निर्भर करता है कि आप क्या काम कर रहे हैं। यदि आप एक मणि पर काम कर रहे हैं, तो अपने Gemfile.lock में जांच न करें। यदि आप एक रेल एप्लिकेशन पर काम कर रहे हैं, तो अपने Gemfile.lock में जांच करें। अधिक जानकारी यहाँ - yehudakatz.com/2010/12/16/…
johnmcaliley

सहायक लेख के लिए Thx।
ashisrai_

1
आपको अपने उत्तर में फिर से कहा जाना चाहिए: चरवाहे को क्या चाहिए।
अनारोना

लेख लिंक को एक नए href की आवश्यकता है
रोस

4
कृपया ऐसा मत करो !! अपने Gemfile.lock को रखें जहां यह है! जैसा यहां और यहां कहा गया है
रिकार्डो रूवर

50

असली समस्या तब होती है जब आप एक ओपन-सोर्स रेल्स ऐप पर काम कर रहे होते हैं, जिसमें एक कॉन्फ़िगर करने योग्य डेटाबेस एडॉप्टर होना चाहिए। मैं फैट फ्री सीआरएम की रेल 3 शाखा विकसित कर रहा हूं। मेरी प्राथमिकता पोस्टग्रेज है, लेकिन हम चाहते हैं कि डिफ़ॉल्ट डेटाबेस mysql2 हो।

इस मामले में, Gemfile.lockअभी भी रत्नों के डिफ़ॉल्ट सेट के साथ जांच की जानी चाहिए, लेकिन मुझे अपने मशीन पर किए गए परिवर्तनों को अनदेखा करना होगा। इसे पूरा करने के लिए, मैं दौड़ता हूं:

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

और रिवर्स करने के लिए:

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

अपने कोड में निम्न कोड जैसी किसी चीज़ को शामिल करना भी उपयोगी है Gemfile। यह आपके डेटाबेस के आधार पर उपयुक्त डेटाबेस एडेप्टर रत्न को लोड करता है।

# 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-कुछ अंक हैं। ओह, हाँ, डेटास्टैम्प देखो। (एसओ की बड़ी विफलताओं में से एक यह है कि यह सवाल पूछे जाने के तुरंत बाद जवाब देने के लिए लाभकारी लाभ है।)
iconoclast

1
@ आईकॉनक्लास्ट: मुझे वास्तव में खुशी है कि आपने जो किया वह पोस्ट किया। मुझे लगता है कि कई लोग जो इस पद पर आते हैं, खुद को शामिल करते हैं, प्रश्न शीर्षक से "अंधे" होते हैं। मुझे अब एहसास हुआ कि मेरा जवाब केवल एक विशिष्ट उपयोग के मामले का जवाब देता है और जरूरी नहीं कि इस सवाल का सही जवाब हो। मैं निकट भविष्य में इसे अद्यतन करने पर काम करूंगा। उस ने कहा, ओपी को मेरे उत्तर को सही नहीं मानना ​​चाहिए था यदि वह उसकी जरूरतों को पूरा नहीं करता था।
rwilliams

34

मेरे काम करने वाले और मेरे पास अलग-अलग Gemfile.lock हैं, क्योंकि हम विभिन्न प्लेटफार्मों, विंडोज़ और मैक का उपयोग करते हैं, और हमारा सर्वर लिनक्स है।

हम रेपो में Gemfile.lock को निकालने का निर्णय लेते हैं और डेटाबेस में ही जैसे git रेपो में Gemfile.lock.server बनाते हैं। फिर इसे सर्वर पर तैनात करने से पहले, हम cap तैनाती हुक का उपयोग करके सर्वर पर Gemfile.lock.server से Gemfile.lock को कॉपी करते हैं


5
मेरे पास एक ऐप है जिसे मैं OSX में विकसित करता हूं और फिर विंडोज सर्वर पर तैनात करना होगा। Gemfile.lock को git के साथ ट्रैक करना एक बुरा विचार साबित हुआ, इसलिए यह मेरी .gitignore फ़ाइल में चला गया। बहुत सारे रत्नों को अलग-अलग वातावरण के लिए अलग-अलग संस्करणों की आवश्यकता होती है। आदर्श रूप से आपको इस स्थिति में होने से बचना चाहिए लेकिन मेरे पास कोई विकल्प नहीं था (धिक्कार है आपको आईटी विभाग में!)
brad

11

आर-डब से सहमत, इसे स्रोत नियंत्रण में रखें, लेकिन मेरे लिए, वास्तविक लाभ यह है:

समरूप वातावरण में सहयोग (विंडोह और लाइनक्स / मैक सामान की अवहेलना)। Gemfile.lock से पहले, परियोजना को स्थापित करने वाले अगले दोस्त को स्वयं को दोष देते हुए सभी प्रकार की भ्रामक त्रुटियां दिखाई दे सकती हैं, लेकिन वह सिर्फ भाग्यशाली व्यक्ति को सुपर मणि का अगला संस्करण मिल रहा था, जो मौजूदा निर्भरता को तोड़ रहा था।

इससे भी बदतर, यह सर्वरों पर हुआ है, जब तक कि अनुशासित नहीं किया जाता है और सटीक संस्करण स्थापित नहीं किया जाता है। Gemfile.lock इसे स्पष्ट करता है, और यह आपको स्पष्ट रूप से बताएगा कि आपके संस्करण अलग हैं।

ध्यान दें: समूह सामग्री को याद रखें, जैसे: विकास और: परीक्षण


11

बुंडलर डॉक्स इस प्रश्न को भी संबोधित करते हैं:

मूल: http://gembundler.com/v1.3/rationale.html

EDIT: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

"नियंत्रण में अपने कोड की जाँच" नामक अनुभाग देखें:

थोड़ी देर के लिए अपने आवेदन को विकसित करने के बाद, Gemfile और Gemfile.lock स्नैपशॉट के साथ एक साथ आवेदन में जांचें। अब, आपकी रिपॉजिटरी में उन सभी रत्नों के सटीक संस्करणों का एक रिकॉर्ड है, जिन्हें आपने पिछली बार इस्तेमाल किया था, ताकि आप यह जान सकें कि एप्लिकेशन ने काम किया है। यह ध्यान रखें कि जब आपकी जेमफाइल केवल तीन रत्नों (संस्करण की सख्ती की डिग्री के साथ) को सूचीबद्ध करती है, तो आपका आवेदन दर्जनों रत्नों पर निर्भर करता है, एक बार जब आप रत्नों की सभी अंतर्निहित आवश्यकताओं पर ध्यान देते हैं।

यह महत्वपूर्ण है: Gemfile.lock आपके एप्लिकेशन को आपके स्वयं के कोड और तृतीय-पक्ष कोड का एक एकल पैकेज बनाता है, यह आखिरी बार चला जब आप यह जानते हैं कि सब कुछ काम किया है। तृतीय-पक्ष कोड के सटीक संस्करणों को निर्दिष्ट करना जो आप अपने जेमफाइल में निर्भर करते हैं, वही गारंटी प्रदान नहीं करेंगे, क्योंकि रत्न आमतौर पर उनकी निर्भरता के लिए कई संस्करणों की घोषणा करते हैं।

अगली बार जब आप एक ही मशीन पर बंडल इंस्टॉल चलाते हैं, तो बंडलर यह देखेगा कि उसमें पहले से ही सभी निर्भरताएं हैं जिनकी आपको आवश्यकता है, और स्थापना प्रक्रिया को छोड़ दें।

.Bundle डायरेक्टरी, या उसके अंदर मौजूद किसी भी फाइल की जाँच न करें। वे फाइलें प्रत्येक विशेष मशीन के लिए विशिष्ट होती हैं, और बंडल इंस्टाल कमांड के रनों के बीच स्थापना विकल्पों को बनाए रखने के लिए उपयोग की जाती हैं।

यदि आपने बंडल पैक चलाया है, तो आपके बंडल के लिए आवश्यक रत्न (हालांकि गिट रत्न) विक्रेता / कैश में डाउनलोड नहीं किए जाएंगे। बुंडलर बिना इंटरनेट (या रूबीजीम्स सर्वर) से जुड़े बिना चल सकता है, यदि आपके लिए आवश्यक सभी रत्न उस फ़ोल्डर में मौजूद हैं और आपके स्रोत नियंत्रण की जाँच की जाती है। यह एक वैकल्पिक कदम है, और अनुशंसित नहीं है, आपके स्रोत नियंत्रण भंडार के आकार में वृद्धि के कारण।


4

नहीं Gemfile.lock का मतलब है:

  • नए योगदानकर्ता परीक्षण नहीं कर सकते क्योंकि अजीब चीजें विफल होती हैं, इसलिए वे योगदान नहीं करेंगे या असफल पीआर प्राप्त करेंगे ... बुरा पहला अनुभव।
  • यदि आप अपने स्थानीय Gemileile .lock को खो देते हैं, तो आप कुल्हाड़ी के पुराने प्रोजेक्ट पर वापस नहीं जा सकते और प्रोजेक्ट को अपडेट / रीराइट किए बिना बग को ठीक कर सकते हैं।

-> हमेशा Gemfile.lock में चेक करें, ट्रैविस को डिलीट करें यदि आप अतिरिक्त पूरी तरह से https://grosser.it/2015/08/14/check-in-your-gemfile-lock/ चाहते हैं


3

पार्टी के लिए थोड़ा देर से, लेकिन जवाब अभी भी मुझे समय लगा और विदेशी ने इस समस्या को समझने के लिए पढ़ा। इसलिए मैं संक्षेप में बताना चाहता हूं कि मुझे जेमफाइल.लॉक के बारे में क्या पता चला है।

जब आप रेल एप्लिकेशन का निर्माण कर रहे होते हैं, तो आप अपने स्थानीय मशीन में रत्नों के कुछ संस्करणों का उपयोग कर रहे होते हैं। यदि आप उत्पादन मोड और अन्य शाखाओं में त्रुटियों से बचना चाहते हैं, तो आपको हर जगह उस एक Gemfile.lock फ़ाइल का उपयोग करना होगा और बंडलर को बताना होगाbundle हर समय हर बार बदलने वाले रत्नों के पुनर्निर्माण के लिए होगा।

यदि Gemfile.lockआपकी उत्पादन मशीन बदल गई है और Git आपको इसकी अनुमति नहीं देता है git pull, तो आपको git reset --hardउस फ़ाइल परिवर्तन से बचने के लिए लिखना चाहिए और git pullफिर से लिखना चाहिए।


यदि कोई फ़ाइल स्वचालित रूप से बदलती है, उदाहरण के लिए बिल्ड प्रक्रिया से, तो यह एक स्पष्ट संकेत है कि इसे संस्करण नियंत्रण में नहीं जोड़ा जाना चाहिए।
थॉमस एस।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.