Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Hiểu Ruby & Rails Console: irb, bundle exec irb, bundle console, rails console

Có nhiều cách mở console Ruby/Rails: irb, bundle exec irb, bundle console, rails console là phổ biến nhất. Chúng trông giống, nhưng mỗi cái hoạt động hơi khác.

Nếu không biết khác biệt, bạn sẽ gặp vấn đề. Có thể không connect ActiveRecord model với database. Hoặc require file lấy version sai. Hoặc thư viện bạn nghĩ có sẵn, thực ra không.

Làm sao đảm bảo dùng console đúng lúc?

Bundler vs non-Bundler

irb chỉ là console Ruby thuần. Nó không quan tâm Gemfile. Chỉ load core Ruby library. Muốn gì khác, phải require.

Nếu cài gem bằng gem install, bạn require được trong irb. Nếu dùng bundle install, bạn có thể require, tùy Bundler để gem ở đâu. (Bundler đôi khi để gem ngoài Ruby gem path, nếu chạy bundle install --path hoặc bundle install --deployment).

Vì irb bỏ qua Gemfile, version trong Gemfile.lock không quan trọng. irb load version mới nhất của gem tìm thấy:

~/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"

Điều này gây vấn đề lạ với code, nếu không ngờ.

irb tốt nếu chơi với core Ruby file. Nhanh, không cần setup.

Nhưng nếu muốn dùng Gemfile khi chạy console, chạy bundle exec irb. bundle exec cho phép irb load gem Bundler biết, và chỉ gem Bundler biết:

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

Đúng version Rails cần.

bundler/setup vs Bundler.require

Khi nào chạy bundle console thay bundle exec irb?

bundle exec irb setup để bạn chỉ require gem trong Gemfile.lock.

bundle console đi xa hơn. Khi chạy bundle console, bạn even không cần require gem trong Gemfile. Chúng đã được require sẵn:

~/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 `
' ~/Source/testapps/consoles jweiss$ bundle console irb(main):001:0> Rails.version => "4.1.5"

Bạn cũng có behavior này nếu gọi Bundler.require trong console bundle exec irb. Gem trong Gemfile không đánh dấu require: false sẽ auto require, dùng ngay không cần việc thêm. Khi làm project có Gemfile, điều đó cực tiện.

Truy cập Rails

Còn một khác biệt: bundle console và 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
=> #

bundle console chỉ require đống gem. rails console require gem đó, nhưng cũng load toàn bộ Rails environment, setup autoloading, initialize application, cho bạn môi trường Rails đầy đủ chơi.

Bạn có thể có giống Rails console từ bundle console nếu require 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
=> #

Mỗi cái, chỉ phức tạp hơn chút

Tóm lại:

  • irb là basic Ruby console. Bỏ qua Gemfile, chỉ core Ruby class accessible không cần require. Không load dễ gem Bundler cài ngoài RubyGems load path.

  • bundle exec irb giống irb, nếu bạn cũng require bundler/setup. Chỉ require dễ gem trong Gemfile.lock, nhưng load gem đó bất kể Bundler để đâu.

  • bundle console giống bundle exec irb, nếu bạn cũng gọi Bundler.require. Tất cả gem trong Gemfile, trừ require: false, dùng được không require. Rất tiện khi viết gem riêng, hoặc làm non-Rails code.

  • rails console giống chạy bundle console trong Rails app, nếu bạn cũng require config/environment.rb. Chơi với toàn bộ Rails app, autoload và DB connection chạy, mọi thứ hook như mong đợi. Nếu làm việc trong Rails app, đây là console hữu ích nhất.

Không quá nhiều khác biệt giữa các console. Và hầu hết khác biệt không quá lớn (À, file này không required? Require nó thôi!), nhưng khác biệt khác sẽ cực kỳ chọc giận nếu không biết chuyện gì xảy ra. (TẠI SAO LẠI LOAD WRONG VERSION CỦA RAKE LẠI!?)

Nhưng nếu biết ý tưởng وراء mỗi console, bạn dùng đúng loại console đúng lúc. Và tất cả thư viện cần sẽ gần khi cần.