Ruby on Rails में Gemfile और Gemfile.lock के बीच क्या अंतर है


125

मैं रूबी ऑन रेल्स के लिए एक शुरुआती हूं और मैं रेल्स 3.0.9 का उपयोग कर रहा हूं।

Rails में Gemfileऔर अंतर क्या है Gemfile.lock?

जवाबों:


159

वह जगह Gemfileहै जहाँ आप निर्दिष्ट करते हैं कि आप किन रत्नों का उपयोग करना चाहते हैं, और आपको कौन से संस्करण निर्दिष्ट करने की अनुमति देते हैं।

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

की जाँच करें Bundler के उद्देश्य और तर्क , विशेष रूप से जांच की जा रही अपने संस्करण नियंत्रण खंड में कोड।


2
यह कैसे काम करना चाहिए - लेकिन स्पष्ट रूप से Gemfile.lockकुछ मामलों (जैसे rails (4.0.0)आवश्यकता bundler (>= 1.3.0, < 2.0)) में 'खुले' संस्करण शामिल हैं , जो समस्याओं का कारण बनता है। किसी भी विचार कैसे उन 'खुले' निर्भरता से बचने के लिए?
गुइलर्मो ग्राऊ

158

आमतौर पर हम Gemfile में निर्भरता लिखते हैं:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

यहाँ आप मूल रूप से कहते हैं: " मुझे नोगोगिरी चाहिए जब तक कि यह संस्करण 1.4.4 से अधिक है ", आदि अब मान लें कि मैंने अपना Gemfile 8 महीने पहले सेट किया है और मैं इस आवश्यकता के साथ अपने ऐप को सफल सेटअप करता हूं। 8 महीने पहले nokogiri संस्करण 1.4.4 था । मेरे रेल एप्लिकेशन इस संस्करण के साथ पूरी तरह से बिना किसी समस्या के चल रहे थे।

अब सोचो कि मैं उसी के साथ निर्माण करने की कोशिश कर रहा हूं Gemfile। लेकिन अगर हम नोकिगिरी संस्करणों को देखें तो हम देखते हैं कि वर्तमान स्थिर संस्करण 1.4.9 में बदल गया है । इसका मतलब है कि अगर हम निर्माण करने की कोशिश करते हैं, तो बंडलर नोकगिरी का 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, तो हर मशीन में एक ही रत्न स्थापित होगा और सबसे महत्वपूर्ण है कि वे सभी एक ही संस्करण प्राप्त करें । यह आपको एक स्थिर और सामान्य परिनियोजन स्टैक देगा।

Gemfile.lock कैसे बनाया जाता है?

यह स्वचालित रूप से पहले के साथ बनाया गया है:

bundle install

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

Gemfile.lock कैसे अपडेट करें?

यदि आप अपने ऐप्स के नवीनतम संस्करण से खुश हैं तो आप अपडेट कर सकते हैं Gemfile.lock। बस अपने परिवर्तनों को प्रतिबिंबित करें Gemfile। इसका मतलब है कि नए सटीक संस्करणों में निर्भरता को बदलना Gemfile। उसके बाद रन:

bundle install

यह आपको Gemfile.lockआपके नवीनतम एप्लिकेशन के साथ अपडेट करेगा ।


19
एक बहुत अच्छा, स्पष्ट विवरण (मैं ऊपर मतदान); लेकिन एक नाइटपिक, हालांकि: स्थापित करने की nokogiri ~> 1.4.4अनुमति नहीं होगी 1.5.3; अधिकतम अनुमति 1.4.xजहां x>=4(नोकगिरी के लिए 1.4.7) होगी । ~>ऑपरेटर साधन सिर्फ पिछले अंक प्रयुक्त मणि में दिए गए संस्करण "इससे अधिक" हो सकता है। उदाहरण के लिए, foo ~> a.b.c.dइसका मतलब है कि कोई भी संस्करण fooतब तक ठीक है जब तक वह अभी भी {कुछ} जहां {कुछ} >=d है। संबंधित प्रश्न
माइकल

1
मुझे क्या भ्रमित करना है कि आप पहले से ही विशिष्ट संस्करण (ओं) gem "nokogiri", "~> 1.4.4"को जेमफाइल में उपयोग करके निर्दिष्ट कर रहे हैं । बंडलर सिर्फ उस संस्करण का उपयोग क्यों नहीं कर सका? क्या यह इसलिए है क्योंकि यह जानबूझकर मणि के नवीनतम संस्करणों को डिफ़ॉल्ट रूप से स्थापित करने के लिए डिज़ाइन किया गया है?
जॉनी

@ जॉनी, देखें michael_n की टिप्पणी। ~> 1.4.4 एक सटीक संस्करण निर्दिष्ट नहीं करता है।
मैथ्यू फ़्लेशेन

2
@ जॉनी, ~> 1.4.4के बराबर है >= 1.4.4 and < 1.5बंडल देखें ।io/v1.5/gemfile.html । एक सटीक संस्करण के लिए, बस उपयोग करें gem 'foo', '1.4.4'
मैथ्यू फ्लैशेन

1
शानदार जवाब लेकिन कृपया स्पष्ट करें कि " Gemfile.lock को अपडेट करें? ": क्या यह खंड कह रहा है कि यहां तक ​​कि अगर कोई प्रतिबंध है और नए प्रतिबंध लागू bundle installकरेगा Gemfile, तो भी क्या यह जांच करेगा ? Gemfile.lockGemfile.lock
JMess

4

जेमफाइल.लॉक

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

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

जिस तरह से निर्भरता संकल्प काम करता है, यहां तक ​​कि एक प्रतीत होता है कि छोटे परिवर्तन (उदाहरण के लिए, आपके जेमफाइल (5) में एक रत्न की निर्भरता के बिंदु-विमोचन के लिए सभी निर्भरता को पूरा करने के लिए आवश्यक रूप से अलग-अलग रत्नों का परिणाम हो सकता है)।

नतीजतन, आप संस्करण नियंत्रण में अपने Gemfile.lock की जाँच करें। यदि आप नहीं करते हैं, तो आपकी रिपॉजिटरी (आपके उत्पादन सर्वर सहित) की जांच करने वाली हर मशीन सभी निर्भरता को फिर से हल कर देगी, जिसके परिणामस्वरूप तीसरे पक्ष के कोड के विभिन्न संस्करणों का उपयोग किया जाएगा यदि रत्न (5) में से कोई भी रत्न या कोई उनकी निर्भरता अद्यतन की गई है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.