Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

อะไรคือความแตกต่างระหว่าง 'Irb', 'Bundle Exec Irb', 'Bundle Console' และ 'Rails Console'

มีหลายวิธีในการเปิดคอนโซล Ruby หรือ Rails:irb , bundle exec irb , bundle console , และ rails console เป็นบางส่วนที่พบบ่อยที่สุด ดูเหมือนคล้ายกันแต่ทำงานแตกต่างกันเล็กน้อย

หากคุณไม่รู้ว่าความแตกต่างเหล่านั้นคืออะไร คุณจะมีปัญหาบางอย่าง บางทีคุณอาจไม่สามารถเชื่อมต่อโมเดล ActiveRecord ของคุณกับฐานข้อมูลได้ หรือคุณจะต้องใช้ไฟล์และรับเวอร์ชันที่ไม่ถูกต้อง หรือห้องสมุดที่คุณคิดว่าจะสามารถใช้ได้ก็ไม่มี

คุณจะแน่ใจได้อย่างไรว่าคุณกำลังใช้คอนโซลที่ถูกต้องในเวลาที่เหมาะสม

การรวมกลุ่มกับผู้ที่ไม่ใช่กลุ่ม

irb เป็นเพียงคอนโซล Ruby ธรรมดา ไม่สนใจ Gemfile . ของคุณ . มันไม่โหลดอะไรเลยนอกจากไลบรารี Ruby หลัก อยากได้อะไรอีก ต้อง require .

หากคุณติดตั้ง gem โดยใช้ gem install คุณสามารถกำหนดให้ใช้ภายใน irb . หากคุณใช้ bundle install , คุณ อาจ สามารถทำได้ขึ้นอยู่กับว่า Bundler วางไว้ที่ใด (บางครั้ง Bundler จะใส่ gem ไว้นอกเส้นทาง gem ของ Ruby หากคุณเรียกใช้บางอย่าง เช่น 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 ดีมากถ้าคุณกำลังยุ่งกับไฟล์ Ruby หลัก รวดเร็วและไม่ต้องตั้งค่าใดๆ

แต่ถ้าคุณต้องการใช้ Gemfile . ของคุณ เมื่อคุณเรียกใช้คอนโซล ให้เรียกใช้ bundle exec irb แทนที่. bundle exec อนุญาตให้ irb เพื่อโหลดอัญมณีที่ Bundler รู้จักและ เท่านั้น อัญมณีที่ Bundler รู้เกี่ยวกับ:

~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.1.5"

เราได้เวอร์ชัน Rails ที่เราต้องการแล้ว

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"

คุณอาจได้รับพฤติกรรมนี้หากคุณเรียก 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 ต้องใช้อัญมณีเหล่านั้น แต่จะโหลดสภาพแวดล้อม Rails ทั้งหมดของคุณ ตั้งค่าการโหลดอัตโนมัติ เริ่มต้นแอปพลิเคชันของคุณ และมอบสภาพแวดล้อม Rails เต็มรูปแบบให้คุณเล่นได้

คุณสามารถรับบางอย่างเช่นคอนโซล Rails จาก 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 เป็นคอนโซล Ruby พื้นฐาน มันไม่สนใจ Gemfile . ของคุณ และเข้าถึงได้เฉพาะคลาส Ruby หลักโดยไม่ต้อง require -ing พวกเขา ไม่สามารถโหลดอัญมณีที่ Bundler ติดตั้งนอกเส้นทางการโหลดของ RubyGems ได้อย่างง่ายดาย

  • bundle exec irb ก็เหมือน irb หากคุณต้องการ bundler/setup . ด้วย . คุณต้องการอัญมณีที่อยู่ใน Gemfile.lock . ของคุณเท่านั้น แต่คุณสามารถโหลดอัญมณีเหล่านั้นได้ไม่ว่า Bundler จะวางไว้ที่ใด

  • bundle console ก็เหมือน bundle exec irb หากคุณเรียก Bundler.require . อัญมณีทั้งหมดใน Gemfile . ของคุณ ยกเว้นที่มีเครื่องหมาย require: false , สามารถใช้ได้โดยไม่ต้องมี สะดวกมากเมื่อคุณเขียนอัญมณีของคุณเองหรือทำงานกับโค้ดที่ไม่ใช่ Rails

  • rails console ก็เหมือนกับการรัน bundle console ภายในแอป Rails หากคุณต้องการ config/environment.rb . คุณสามารถเล่นกับแอป Rails ทั้งหมดของคุณ การโหลดอัตโนมัติและการเชื่อมต่อฐานข้อมูล และทุกอย่างเป็นไปตามที่คุณคาดหวัง หากคุณกำลังใช้งานแอป Rails นี่เป็นคอนโซลที่มีประโยชน์ที่สุด

คอนโซลเหล่านี้มีความแตกต่างกันไม่มากนัก และในขณะที่ความแตกต่างเหล่านั้นส่วนใหญ่จะไม่ใหญ่เกินไป (โอ้ ไฟล์นี้ไม่จำเป็นหรือ ต้องใช้มันดีกว่า!) คนอื่นจะโกรธเคืองโดยสิ้นเชิงหากคุณไม่รู้ว่าเกิดอะไรขึ้น (ทำไมโหลดเวอร์ชั่นของคราดอีกครั้งผิด!?)

แต่ถ้าคุณรู้แนวคิดเบื้องหลังคอนโซลเหล่านี้ คุณจะสามารถใช้คอนโซลประเภทที่ถูกต้องในเวลาที่เหมาะสม และห้องสมุดทั้งหมดที่คุณต้องการจะอยู่ใกล้เมื่อคุณต้องการ