Câu trả lời:
Điều này có nghĩa là cài đặt đá quý, nhưng không yêu cầu gọi khi bạn khởi động Bundler. Vì vậy, bạn sẽ cần phải gọi bằng tay
require "whenever"
nếu bạn muốn sử dụng thư viện
Nếu bạn phải làm
gem "whenever", require: "whereever"
sau đó bundler sẽ tải xuống viên ngọc có tên bất cứ khi nào, nhưng sẽ gọi
require "whereever"
Điều này thường được sử dụng nếu tên của thư viện cần yêu cầu khác với tên của đá quý.
:require => false
những viên đá quý đặc biệt và rõ ràng require "thegem"
từ nhiệm vụ cào. Điều này sau đó sẽ tiết kiệm bộ nhớ trong các quy trình ứng dụng chính và thời gian khởi động, v.v. Tuy nhiên, hiệu suất ứng dụng sẽ không bị ảnh hưởng ngay cả khi bạn yêu cầu những viên ngọc bổ sung này trong mọi quy trình.
require 'yaml'
, bây giờ bạn có YAML
mô-đun như một đối tượng trong bộ nhớ.
:require => false
và sau đó trong mã của bạn có mộtrequire 'library_name_here'
Bạn sử dụng :require => false
khi bạn muốn cài đặt đá quý nhưng không "bắt buộc".
Vì vậy, trong ví dụ bạn đã đưa ra:
gem 'whenever', :require => false
khi ai đó chạy gói cài đặt, bất cứ khi nào gem sẽ được cài đặt như với gem install whenever
. Bất cứ khi nào được sử dụng để tạo các công việc định kỳ bằng cách chạy một tác vụ cào nhưng thường không được sử dụng từ bên trong đường ray (hoặc khung khác nếu không phải đường ray).
Vì vậy, bạn có thể sử dụng :require => false
cho bất cứ thứ gì bạn cần để chạy từ dòng lệnh nhưng không cần trong mã của bạn.
require: false
nói Bundler.require
không yêu cầu đá quý cụ thể đó: đá quý phải được yêu cầu rõ ràng thông qua require 'gem'
.
Tùy chọn này không ảnh hưởng đến:
bundle install
: viên ngọc sẽ được cài đặt bất kể
các require
thiết lập đường dẫn tìm kiếm bằng cách bundler.
Bundler thêm mọi thứ vào đường dẫn khi bạn thực hiện:
Bundle.setup
require bundler/setup
bundle exec
Thí dụ
Đá quý
source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false
chính.rb
# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end
# The Bundler object is automatically required on `bundle exec`.
Bundler.require
Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end
# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker
Sau đó, những điều sau đây sẽ không đưa ra ngoại lệ:
bundle install --path=.bundle
bundle exec ruby main.rb
Trên GitHub để bạn chơi với nó.
Sử dụng đường ray
Như đã giải thích trong hướng dẫn khởi tạo , mẫu Rails mặc định chạy khi khởi động:
config/boot.rb
config/application.rb
config/boot.rb
chứa đựng:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
mà không require 'bundler/setup'
và thiết lập đường dẫn yêu cầu.
config/application.rb
làm:
Bundler.require(:default, Rails.env)
trong đó thực sự đòi hỏi đá quý.
require 'faker
có thể không sử dụng phiên bản đá quý chính xác, cụ thể nếu bạn là Gemfile trỏ đến một git ref.
Bất cứ khi nào bạn chỉ định Đá quý trong Gemfile
và chạy bundle install
, trình đóng gói sẽ đi và cài đặt đá quý được chỉ định và tải mã cho Đá quý đó trong ứng dụng của bạn bằng cách đặt cách require 'whenever'
này, trình đóng gói sẽ tải mã cho tất cả các Đá quý của bạn trong ứng dụng Rails của bạn và bạn có thể gọi bất kỳ phương thức nào từ bất kỳ Gem nào mà không có bất kỳ đau đớn, như bạn làm hầu hết thời gian.
nhưng Gems like whenever, faker or capistrano
là thứ bạn không cần trong mã ứng dụng, bạn cần bất cứ khi nào mã trong schedule.rb
tệp của bạn để quản lý mã crons và capistrano trong deploy.rb
tệp để tùy chỉnh công thức triển khai, do đó bạn không cần phải tải mã cho các đá quý này trong mã ứng dụng của mình và bất cứ nơi nào bạn muốn gọi bất kỳ phương thức nào từ những viên Đá quý này, bạn có thể tự yêu cầu đá quý của mình bằng cách đặt require "whenever"
. Vì vậy, bạn đã đặt :require => false
Gemfile của mình cho những viên Đá quý này, bằng cách này, trình đóng gói sẽ cài đặt Gem đó nhưng không tải mã cho chính Gem đó, bạn có thể làm điều đó bất cứ khi nào bạn muốn bằng cách đặt yêu cầu 'bất cứ khi nào' trong trường hợp của bạn.
Để yêu cầu đá quý trong Gemfile của bạn, bạn sẽ cần gọi Bundler.require
.
Bạn có thể ngăn trình đóng gói yêu cầu đá quý require: false
, nhưng nó vẫn sẽ cài đặt và duy trì đá quý. Kiểm tra này để được giải thích chi tiết hơn.
Bundler.require
theo mặc định như tôi hiểu. Chỉ có câu trả lời của Ciro và Nesha là đúng.