这意味着安装 gem,但在启动 Bundler 时不要调用 require。所以你需要手动调用
require "whenever"
如果你想使用图书馆。
如果你要做
gem "whenever", require: "whereever"
然后 bundler 会随时下载命名的 gem,但会调用
require "whereever"
如果需要的库名称与 gem 的名称不同,则通常使用此方法。
当您希望安装 gem 但不是“必需的”时使用 :require => false
。
因此,在您给出的示例中:gem 'whenever', :require => false
当有人运行 bundle install 时,gem 将与 gem install whenever
一样安装。 When 用于通过运行 rake 任务来创建 cron 作业,但通常不在 rails(或其他框架,如果不是 rails)应用程序中使用。
因此,您可以将 :require => false
用于需要从命令行运行但在代码中不需要的任何内容。
require: false
告诉 Bundler.require
不要要求特定的 gem:必须通过 require 'gem'
明确要求 gem。
此选项不影响:
捆绑安装:无论如何都会安装gem
bundler 设置的需要搜索路径。当您执行以下任一操作时,Bundler 会将内容添加到路径中: Bundle.setup 由 require 调用 bundler/setup 由 bundle exec 调用
Bundle.setup
由 require bundler/setup 调用
由 bundle exec 调用
例子
宝石文件
source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false
主文件
# 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
那么以下不会引发异常:
bundle install --path=.bundle
bundle exec ruby main.rb
On GitHub 供您使用。
导轨使用
如 initialization tutorial 中所述,默认的 Rails 模板在启动时运行:
配置/boot.rb
配置/应用程序.rb
config/boot.rb
包含:
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
它执行 require 'bundler/setup'
并设置所需路径。
config/application.rb
会:
Bundler.require(:default, Rails.env)
这实际上需要宝石。
require 'faker
可能不会使用正确的 gem 版本,特别是如果您的 Gemfile 指向 git ref。
每当您在 Gemfile
中指定 Gem 并运行 bundle install
时,bundler 都会安装指定的 gem 并在您的应用程序中加载该 Gem 的代码,方法是这样放置 require 'whenever'
,bundler 将为您的所有 Gem 加载代码Rails 应用程序,您可以从任何 Gem 调用任何方法,而无需任何痛苦,就像您大多数时候所做的那样。
但是像 whenever, faker or capistrano
这样的 Gem 是您的应用程序代码中不需要的东西,只要您的 schedule.rb
文件中的代码用于管理 deploy.rb
文件中的 crons 和 capistrano 代码以自定义部署配方,因此您无需加载代码这些 gem 在您的应用程序代码中以及您想从这些 Gem 调用任何方法的任何位置,您都可以通过放置 require "whenever"
手动手动要求这些 gem。因此,您将 :require => false
放入这些 Gem 的 Gemfile 中,这样捆绑程序将安装该 Gem,但不加载该 Gem 本身的代码,您可以随时通过简单地在您的情况下输入 like require 'whenever' 来执行此操作。
为了在您的 Gemfile 中需要 gem,您需要调用 Bundler.require
。
您可以使用 require: false
阻止 bundler 需要 gem,但它仍会安装和维护 gem。查看 this out 以获得更详细的说明。
类比解释
## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss"
“dealing_with_boss” - 始终需要 - 加载到内存中并准备就绪。
我很少需要学位宝石。只有当我与招聘人员交谈时。所以我手动要求它,突然之间像“Black Scholes-Merton”和“heteroskadasticity”这样的花哨的词立即加载到内存中;我告诉招聘人员我可以进行复杂的排序算法:例如,三种不同语言的“冒泡排序”:Javascript、EcmaScript 和 ES16——看看我有多聪明——这通常足以让我与其他人交谈。
:require => false
这些特定的宝石并明确地require "thegem"
。这将在主应用程序进程和启动时间等中节省内存。但是,即使您在每个进程中都需要这些额外的 gem,应用程序性能也不应该受到影响。require 'yaml'
,您现在也将YAML
模块作为内存中的一个对象。:require => false
,然后在您的代码中有一个require 'library_name_here'