রুবি বা রেইলস কনসোল লঞ্চ করার অনেক উপায় আছে: irb, bundle exec irb, bundle console, এবং rails console সবচেয়ে কমন। সেগুলো একই দেখালেও, প্রতিটা একটু আলাদাভাবে কাজ করে।
আপনি যদি সেসব পার্থক্য না জানেন, তবে সমস্যা হবেই। হয়তো আপনি আপনার অ্যাক্টিভরেকর্ড মডেলগুলো ডাটাবেসের সাথে কানেক্ট করতে পারবেন না। অথবা আপনি একটি ফাইল রিকোয়ার করবেন এবং ভুল ভার্সন পাবেন। অথবা আপনি যে লাইব্রেরি উপলব্ধ থাকবে মনে করছিলেন, সেটা উপলব্ধ নেই।
আপনি কীভাবে নিশ্চিত করবেন সঠিক কনসোল সঠিক সময়ে ব্যবহার করছেন?
বান্ডলার বনাম নন-বান্ডলার
irb শুধু একটি সাদা রুবি কনসোল। এটা আপনার Gemfile-এর চিন্তা করে না। এটা কোর রুবি লাইব্রেরি ছাড়া কিছু লোড করে না। আপনার প্রয়োজন যেটা, সেটা আপনাকে require করতে হবে।
আপনি যদি gem install ব্যবহার করে জেম ইনস্টল করেন, তবে আপনি irb-এর ভিতরে সেটা রিকোয়ার করতে পারেন। আপনি যদি bundle install ব্যবহার করেন, তবে আপনি হয়তো সেটা রিকোয়ার করতে পারবেন, বান্ডলার সেটা কোথায় রাখল সেটার ওপর নির্ভর করে। (বান্ডলার কখনো কখনো জেমগুলো রুবির জেম পাথের বাইরে রাখে, যদি আপনি bundle install --path বা bundle install --deployment রান করেন)।
যেহেতু irb আপনার Gemfile-কে উপেক্ষা করে, Gemfile.lock-এর ভার্সনগুলো মেইন করে না। irb সেটা পাওয়া যাবে সেটার নwedtest ভার্সন লোড করবে:
~/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/setup বনাম 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"
আপনি একই বিহেভিয়র পেতে পারেন যদি আপনি আপনার bundle exec irb কনসোলে Bundler.require কল করেন। আপনার 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 রিকোয়ার করেন:
~/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না করলে। বান্ডলার রুবিজেমসের লোড পাথের বাইরে জেম ইনস্টল করলে সেটা সহজে লোড করতে পারে না। -
bundle exec irbহলোirb, যদি আপনিbundler/setupরিকোয়ার করতেন। আপনি শুধু সহজে আপনারGemfile.lock-এ থাকা জেমগুলো রিকোয়ার করতে পারেন, কিন্তু বান্ডলার সেগুলো কোথাও রাখে না কেন, আপনি লোড করতে পারবেন। -
bundle consoleহলোbundle exec irb, যদি আপনিBundler.requireকল করতেন। আপনারGemfile-এ থাকা সব জেম,require: falseমার্ক করা ছাড়া, রিকোয়ার ছাড়া ব্যবহার করা যায়। আপনার নিজের জেম লিখলে, বা নন-রেইলস কোডে কাজ করলে, এটা খুব সুবিধাজনক। -
rails consoleহলো রেইলস অ্যাপ্লিকেশনের ভিতরেbundle consoleরান করার মত, যদি আপনিconfig/environment.rbরিকোয়ার করতেন। আপনি আপনার পুরো রেইলস অ্যাপ্লিকেশন নিয়ে খেলতে পারেন, অটোলোড এবং ডাটাবেস কানেকশন কাজ করে, এবং সবকিছু আপনার এক্সপেক্টেশন অনুযায়ী হুক আপ করা থাকে। আপনি যদি রেইলস অ্যাপ্লিকেশনে কাজ করেন, এটাই সবচেয়ে হেল্পফুল কনসোল।
এই কনসোলগুলোর মধ্যে বেশি পার্থক্য নেই। এবং যেসব পার্থক্য আছে, অধিকাংশ সময় সেগুলো বড় হবে না (ওহ, এই ফাইল রিকোয়ার্ড হয়নি? ভালো, রিকোয়ার করি!), কিন্তু অন্যগুলো পুরোপুরি চিড়াচিড়ি করে দেবে আপনি না জানলে কী হচ্ছে। (কেন বার বার রেকের ভুল ভার্সন লোড হচ্ছে!?)
তবে আপনি যদি এই কনসোলগুলোর পেছনের আইডিয়া জানেন, তবে আপনি সঠিক টাইপের কনসোল সঠিক সময়ে ব্যবহার করতে পারবেন। এবং আপনার প্রয়োজনীয় সব লাইব্রেরি আপনার কাছে থাকবে যখন দরকার।