जवाबों:
वह जगह 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'
..
यहाँ आप मूल रूप से कहते हैं: " मुझे नोगोगिरी चाहिए जब तक कि यह संस्करण 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
, तो हर मशीन में एक ही रत्न स्थापित होगा और सबसे महत्वपूर्ण है कि वे सभी एक ही संस्करण प्राप्त करें । यह आपको एक स्थिर और सामान्य परिनियोजन स्टैक देगा।
यह स्वचालित रूप से पहले के साथ बनाया गया है:
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
(नोकगिरी के लिए 1.4.7
) होगी । ~>
ऑपरेटर साधन सिर्फ पिछले अंक प्रयुक्त मणि में दिए गए संस्करण "इससे अधिक" हो सकता है। उदाहरण के लिए, foo ~> a.b.c.d
इसका मतलब है कि कोई भी संस्करण foo
तब तक ठीक है जब तक वह अभी भी {कुछ} जहां {कुछ} >=
d है। संबंधित प्रश्न
gem "nokogiri", "~> 1.4.4"
को जेमफाइल में उपयोग करके निर्दिष्ट कर रहे हैं । बंडलर सिर्फ उस संस्करण का उपयोग क्यों नहीं कर सका? क्या यह इसलिए है क्योंकि यह जानबूझकर मणि के नवीनतम संस्करणों को डिफ़ॉल्ट रूप से स्थापित करने के लिए डिज़ाइन किया गया है?
~> 1.4.4
के बराबर है >= 1.4.4 and < 1.5
। बंडल देखें ।io/v1.5/gemfile.html । एक सटीक संस्करण के लिए, बस उपयोग करें gem 'foo', '1.4.4'
।
bundle install
करेगा Gemfile
, तो भी क्या यह जांच करेगा ? Gemfile.lock
Gemfile.lock
जेमफाइल.लॉक
जब आप बंडल इंस्टॉल चलाते हैं, तो Bundler आपके द्वारा उपयोग किए जाने वाले सभी रत्नों के पूर्ण नाम और संस्करण को जारी रखेगा (Gemfile (5) में निर्दिष्ट रत्नों की निर्भरता) Gemfile.lock नामक फ़ाइल में।
बंडल को स्थापित करने के लिए बाद की सभी कॉलों में इस फ़ाइल का उपयोग करता है, जो इस बात की गारंटी देता है कि आप हमेशा उसी सटीक कोड का उपयोग करते हैं, यहां तक कि आपका आवेदन मशीनों में भी चलता रहता है।
जिस तरह से निर्भरता संकल्प काम करता है, यहां तक कि एक प्रतीत होता है कि छोटे परिवर्तन (उदाहरण के लिए, आपके जेमफाइल (5) में एक रत्न की निर्भरता के बिंदु-विमोचन के लिए सभी निर्भरता को पूरा करने के लिए आवश्यक रूप से अलग-अलग रत्नों का परिणाम हो सकता है)।
नतीजतन, आप संस्करण नियंत्रण में अपने Gemfile.lock की जाँच करें। यदि आप नहीं करते हैं, तो आपकी रिपॉजिटरी (आपके उत्पादन सर्वर सहित) की जांच करने वाली हर मशीन सभी निर्भरता को फिर से हल कर देगी, जिसके परिणामस्वरूप तीसरे पक्ष के कोड के विभिन्न संस्करणों का उपयोग किया जाएगा यदि रत्न (5) में से कोई भी रत्न या कोई उनकी निर्भरता अद्यतन की गई है।
Gemfile.lock
कुछ मामलों (जैसेrails (4.0.0)
आवश्यकताbundler (>= 1.3.0, < 2.0)
) में 'खुले' संस्करण शामिल हैं , जो समस्याओं का कारण बनता है। किसी भी विचार कैसे उन 'खुले' निर्भरता से बचने के लिए?