Computer >> Máy Tính >  >> Lập trình >> Ruby

Sự khác biệt giữa `Irb`,` Bundle Exec Irb`, `Bundle Console` và` Rails Console`?

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 consolerails 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 consolerails 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ỏ qua Gemfile 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ần require -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ầu bundler/setup . Bạn chỉ có thể dễ dàng yêu cầu các viên ngọc có trong Gemfile.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 trong Gemfile của bạn , ngoại trừ những cái được đánh dấu require: 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ạy bundle console bên trong ứng dụng Rails, nếu bạn cũng yêu cầu config/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.