Có rất nhiều cách để khởi chạy bảng điều khiển Ruby hoặc Rails:irb
, bundle exec irb
, bundle console
và rails console
là một số phổ biến nhất. Chúng có vẻ giống nhau, nhưng chúng hoạt động hơi khác một chút.
Nếu bạn không biết những khác biệt đó là gì, bạn sẽ gặp một số vấn đề. Có thể bạn sẽ không thể kết nối các mô hình ActiveRecord của mình với cơ sở dữ liệu. Hoặc bạn sẽ yêu cầu một tệp và nhận được phiên bản sai. Hoặc một thư viện mà bạn nghĩ là có sẵn, nhưng lại không.
Làm cách nào để bạn đảm bảo rằng mình đang sử dụng đúng bảng điều khiển vào đúng thời điểm?
Bundler so với non-Bundler
irb
chỉ là một bảng điều khiển Ruby đơn giản. Nó không quan tâm đến Gemfile
của bạn . Nó không tải bất cứ thứ gì ngoài các thư viện Ruby cốt lõi. Bất cứ điều gì khác bạn muốn, bạn phải require
.
Nếu bạn cài đặt một gem bằng gem install
, bạn có thể yêu cầu nó bên trong irb
. Nếu bạn đã sử dụng bundle install
, bạn có thể có thể yêu cầu nó, tùy thuộc vào nơi Bundler đặt nó. (Đôi khi, Bundler sẽ đặt các viên đá quý bên ngoài đường dẫn đá quý của Ruby, nếu bạn chạy một cái gì đó như bundle install --path
hoặc bundle install --deployment
).
Kể từ khi irb
bỏ qua Gemfile
của bạn , các phiên bản bên trong Gemfile.lock
của bạn không thành vấn đề. irb
sẽ tải phiên bản đá quý mới nhất mà nó có thể 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 có thể gây ra các vấn đề thực sự kỳ lạ với mã của bạn, nếu bạn không mong đợi.
irb
thật tuyệt nếu bạn đang gặp rắc rối với các tệp Ruby lõi. Nó nhanh chóng và không cần bất kỳ thiết lập nào.
Nhưng nếu bạn muốn sử dụng Gemfile
của mình khi bạn chạy bảng điều khiển, hãy chạy bundle exec irb
thay vì. bundle exec
cho phép irb
để tải các đá quý mà Bundler biết và chỉ những viên đá quý mà Bundler biết về:
~/Source/testapps/consoles jweiss$ bundle exec irb
irb(main):001:0> require 'rails'
=> true
irb(main):002:0> Rails.version
=> "4.1.5"
Chúng tôi có chính xác phiên bản Rails mà chúng tôi đang tìm kiếm.
Bundler / setup so với Bundler.require
Khi nào bạn chạy bundle console
thay vì bundle exec irb
?
bundle exec irb
thiết lập mọi thứ để bạn chỉ có thể yêu cầu các viên đá quý trong Gemfile.lock
của mình .
bundle console
tiến thêm một bước nữa. Khi bạn chạy bundle console
, bạn thậm chí không cần yêu cầu đá quý trong Gemfile
của mình . Chúng đã được yêu cầu cho bạ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 `<main>'
~/Source/testapps/consoles jweiss$ bundle console
irb(main):001:0> Rails.version
=> "4.1.5"
Bạn cũng có thể nhận được hành vi này nếu bạn gọi Bundler.require
bên trong bundle exec irb
của bạn bàn điều khiển. Bất kỳ viên ngọc nào trong Gemfile
của bạn không được đánh dấu require: false
sẽ tự động được yêu cầu và bạn sẽ có thể sử dụng nó mà không cần phải làm gì thêm. Khi bạn đang làm việc trên các dự án với Gemfile
, điều đó vô cùng tiện lợi.
Truy cập Rails
Vẫn còn một điểm khác biệt cần suy nghĩ: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
=> #<Consoles::Application:0x007f8db4d5ab30 @_all_autoload_paths=["/Users/jweiss...
bundle console
chỉ cần một loạt đá quý. rails console
yêu cầu những viên ngọc đó, nhưng nó cũng sẽ tải toàn bộ môi trường Rails của bạn, thiết lập tự động tải, khởi chạy ứng dụng của bạn và cung cấp cho bạn một môi trường Rails đầy đủ để chơi.
Bạn có thể tải thứ gì đó giống như bảng điều khiển Rails từ bundle console
nếu bạn yêu cầu 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...
Mỗi cái phức tạp hơn một chút
Tóm lại:
-
irb
là bảng điều khiển Ruby cơ bản. Nó bỏ quaGemfile
của bạn , và chỉ các lớp Ruby cốt lõi mới có thể truy cập được mà không cầnrequire
-ing chúng. Nó không thể dễ dàng tải các đá quý mà Bundler cài đặt bên ngoài đường dẫn tải của RubyGems. -
bundle exec irb
giống nhưirb
, nếu bạn cũng yêu cầubundler/setup
. Bạn chỉ có thể dễ dàng yêu cầu các viên ngọc có trongGemfile.lock
của mình , nhưng bạn có thể tải những viên ngọc đó bất kể Bundler đặt chúng ở đâu. -
bundle console
giống nhưbundle exec irb
, nếu bạn cũng gọi làBundler.require
. Tất cả các viên ngọc trongGemfile
của bạn , ngoại trừ những cái được đánh dấurequire: false
, có thể được sử dụng mà không yêu cầu chúng. Nó thực sự thuận tiện khi bạn đang viết đá quý của riêng mình hoặc làm việc trên mã không phải Rails. -
rails console
giống như chạybundle console
bên trong ứng dụng Rails, nếu bạn cũng yêu cầuconfig/environment.rb
. Bạn có thể chơi với toàn bộ ứng dụng Rails của mình, các bản tự động sửa lỗi và kết nối cơ sở dữ liệu hoạt động và mọi thứ được kết nối theo cách bạn mong đợi. Nếu bạn đang làm việc trong ứng dụng Rails, đây là loại bảng điều khiển hữu ích nhất.
Không có quá nhiều khác biệt giữa các bảng điều khiển này. Và mặc dù hầu hết những khác biệt đó sẽ không quá lớn (Ồ, tệp này không bắt buộc? Tốt hơn là nên yêu cầu nó!), Những người khác sẽ hoàn toàn tức giận nếu bạn không biết chuyện gì đang xảy ra. (TẠI SAO ĐIỀU NÀY TẢI PHIÊN BẢN SAI CỦA RAKE LẠI !?)
Nhưng nếu bạn biết ý tưởng đằng sau mỗi bảng điều khiển này, bạn sẽ có thể sử dụng đúng loại bảng điều khiển vào đúng thời điểm. Và tất cả các thư viện bạn cần sẽ có mặt khi bạn cần.