रूबी या रेल कंसोल को लॉन्च करने के कई तरीके हैं:irb
, bundle exec irb
, bundle console
, और rails console
कुछ सबसे आम हैं। वे एक जैसे लगते हैं, लेकिन वे प्रत्येक थोड़ा अलग तरीके से काम करते हैं।
यदि आप नहीं जानते कि वे अंतर क्या हैं, तो आपको कुछ समस्याएं होंगी। हो सकता है कि आप अपने ActiveRecord मॉडल को डेटाबेस से कनेक्ट नहीं कर पाएंगे। या आपको एक फ़ाइल की आवश्यकता होगी और गलत संस्करण प्राप्त होगा। या एक पुस्तकालय जो आपने सोचा था कि उपलब्ध नहीं होगा।
आप कैसे सुनिश्चित करते हैं कि आप सही समय पर सही कंसोल का उपयोग कर रहे हैं?
बंडलर बनाम गैर-बंडलर
irb
सिर्फ एक सादा रूबी कंसोल है। यह आपके Gemfile
की परवाह नहीं करता है . यह कोर रूबी पुस्तकालयों के अलावा कुछ भी लोड नहीं करता है। आप जो कुछ भी चाहते हैं, आपको require
करना होगा ।
यदि आप gem install
. का उपयोग करके कोई रत्न स्थापित करते हैं , आप इसकी आवश्यकता irb
. के अंदर ले सकते हैं . अगर आपने bundle install
. का इस्तेमाल किया है , आप शायद बंडलर ने इसे कहां रखा है, इसके आधार पर इसकी आवश्यकता हो सकती है। (बंडलर कभी-कभी रत्नों को रूबी के रत्न पथ के बाहर रख देगा, यदि आप bundle install --path
जैसा कुछ चलाते हैं या bundle install --deployment
)।
चूंकि irb
आपके Gemfile
. पर ध्यान नहीं देता , आपके Gemfile.lock
. के अंदर के संस्करण कोई फर्क नहीं पड़ता। irb
एक रत्न के नवीनतम संस्करण को लोड करेगा जो इसे मिल सकता है:
~/Source/testapps/consoles[master *] jweiss$ gem list rails
*** LOCAL GEMS ***
rails (4.2.0.beta2, 4.2.0.beta1, 4.1.5, 4.1.1)
~/Source/testapps/consoles jweiss$ cat Gemfile | grep rails
gem 'rails', '4.1.5'
~/Source/testapps/consoles jweiss$ irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.2.0.beta2"
यदि आप इसकी अपेक्षा नहीं कर रहे हैं, तो यह आपके कोड के साथ वास्तव में अजीब समस्याएं पैदा कर सकता है।
irb
यदि आप कोर रूबी फाइलों के साथ खिलवाड़ कर रहे हैं तो बहुत अच्छा है। यह तेज़ है, और इसके लिए किसी सेटअप की आवश्यकता नहीं है।
लेकिन अगर आप अपने Gemfile
. का उपयोग करना चाहते हैं जब आप कंसोल चलाते हैं, तो bundle exec irb
चलाएं बजाय। bundle exec
अनुमति देता है irb
उन रत्नों को लोड करने के लिए जिनके बारे में बंडलर जानता है, और केवल रत्न बंडलर के बारे में जानता है:
~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.1.5"
हमें ठीक वही रेल संस्करण मिला जिसकी हम तलाश कर रहे थे।
बंडलर/सेटअप बनाम Bundler.require
आप bundle console
कब चलाएंगे? इसके बजाय bundle exec irb
?
bundle exec irb
चीजों को सेट करता है ताकि आपको केवल अपने Gemfile.lock
. में रत्नों की आवश्यकता हो ।
bundle console
एक कदम आगे जाता है। जब आप bundle console
चलाते हैं , आपको अपने Gemfile
. में रत्नों की आवश्यकता भी नहीं है . वे आपके लिए पहले से ही आवश्यक हैं:
~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> Rails.version
NameError: uninitialized constant Rails
from (irb):1
from /usr/local/bin/irb:11:in `<main>'
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.version
=> "4.1.5"
यदि आप Bundler.require
. को कॉल करते हैं, तो भी आपको यह व्यवहार मिल सकता है आपके bundle exec irb
. के अंदर सांत्वना देना। आपके Gemfile
. में कोई भी रत्न जो चिह्नित नहीं है require: false
स्वचालित रूप से आवश्यक हो जाएगा, और आप बिना किसी अतिरिक्त काम के इसका उपयोग करने में सक्षम होंगे। जब आप किसी Gemfile
. के साथ प्रोजेक्ट पर काम कर रहे हों , यह अविश्वसनीय रूप से सुविधाजनक है।
एक्सेसिंग रेल्स
इसके बारे में सोचने के लिए अभी भी एक अंतर है:bundle console
और rails console
।
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.application
=> nil
~/Source/testapps/consoles jweiss$ rails console
Loading development environment (Rails 4.1.5)
irb(main):001:0> Rails.application
=> #<Consoles::Application:0x007f8db4d5ab30 @_all_autoload_paths=["/Users/jweiss...
bundle console
बस रत्नों का एक गुच्छा चाहिए। rails console
उन रत्नों की आवश्यकता है, लेकिन यह आपके पूरे रेल वातावरण को भी लोड करेगा, ऑटोलोडिंग सेट करेगा, आपके एप्लिकेशन को प्रारंभ करेगा, और आपको खेलने के लिए एक पूर्ण रेल वातावरण प्रदान करेगा।
आप bundle console
. से रेल कंसोल जैसा कुछ प्राप्त कर सकते हैं अगर आपको config/environment.rb
require की आवश्यकता है :
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.application
=> nil
irb(main):002:0> require_relative 'config/environment.rb'
=> true
irb(main):003:0> Rails.application
=> #<Consoles::Application:0x007fd264f0b7c8 @_all_autoload_paths=["/Users/jweiss...
हर एक, बस थोड़ा अधिक जटिल
तो, संक्षेप में:
-
irb
मूल रूबी कंसोल है। यह आपकेGemfile
. पर ध्यान नहीं देता है , और केवल कोर रूबी कक्षाएंrequire
. के बिना पहुंच योग्य हैं - उन्हें. यह उन रत्नों को आसानी से लोड नहीं कर सकता जिन्हें बंडलर RubyGems के लोड पथ के बाहर स्थापित करता है। -
bundle exec irb
irb
like जैसा है , अगर आपकोbundler/setup
. की भी आवश्यकता है . आपको केवल उन रत्नों की आसानी से आवश्यकता हो सकती है जो आपकेGemfile.lock
. में हैं , लेकिन आप उन रत्नों को लोड कर सकते हैं चाहे बंडलर ने उन्हें कहीं भी रखा हो। -
bundle console
bundle exec irb
जैसा है , अगर आपनेBundler.require
. भी कहा है . आपकेGemfile
. के सभी रत्न , चिह्नित किए गए को छोड़करrequire: false
, उनकी आवश्यकता के बिना उपयोग किया जा सकता है। जब आप अपने खुद के रत्न लिख रहे हों, या गैर-रेल कोड पर काम कर रहे हों तो यह वास्तव में सुविधाजनक होता है। -
rails console
bundle console
चलाने जैसा है एक रेल ऐप के अंदर, यदि आपकोconfig/environment.rb
. की भी आवश्यकता है . आप अपने पूरे रेल ऐप के साथ खेल सकते हैं, ऑटोलोड और डेटाबेस कनेक्शन काम करते हैं, और जिस तरह से आप उम्मीद करते हैं, सब कुछ जुड़ा हुआ है। यदि आप रेल ऐप में काम कर रहे हैं, तो यह सबसे उपयोगी प्रकार का कंसोल है।
इन कंसोल के बीच बहुत अधिक अंतर नहीं हैं। और जबकि उनमें से अधिकतर अंतर बहुत बड़े नहीं होंगे (ओह, इस फ़ाइल की आवश्यकता नहीं है? बेहतर इसकी आवश्यकता है!), यदि आप नहीं जानते कि क्या हो रहा है तो अन्य पूरी तरह से क्रोधित होंगे। (यह फिर से रेक के गलत संस्करण को क्यों लोड कर रहा है!?)
लेकिन अगर आप इनमें से प्रत्येक कंसोल के पीछे के विचार को जानते हैं, तो आप सही समय पर सही प्रकार के कंसोल का उपयोग करने में सक्षम होंगे। और जब भी आपको उनकी आवश्यकता होगी वे सभी पुस्तकालय आपके पास होंगे।