这样做:

gem 'whenever', require: false

意味着需要安装gem,还是意味着不需要它?


当前回答

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss" 

"dealing_with_boss" -总是需要的-加载到内存中并准备运行。 学位宝石-不需要. ...但如果需要,则需要在代码中手动要求它。

其他回答

这意味着安装gem,但在启动Bundler时不调用require。因此您需要手动调用

require "whenever"

如果你想去图书馆的话。

如果你要这么做

gem "whenever", require: "whereever"

然后捆绑者将下载宝石命名,但会调用

require "whereever"

如果需要的库的名称与gem的名称不同,则通常使用这种方法。

你使用:require => false当你想要安装宝石,但不是“必需的”。

在你给出的例子中: Gem '无论何时',:require => false 当有人运行bundle install时,无论何时都安装gem,就像安装gem时一样。用于通过运行rake任务来创建cron作业,但通常不从rails(或其他框架,如果不是rails)应用程序中使用。

因此,您可以使用:require => false用于需要从命令行运行但在代码中不需要的任何内容。

为了在你的Gemfile中需要宝石,你需要调用Bundler.require。

你可以用require: false来防止捆绑器要求gem,但是它仍然会安装和维护gem。查看这个来获得更详细的解释。

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss" 

"dealing_with_boss" -总是需要的-加载到内存中并准备运行。 学位宝石-不需要. ...但如果需要,则需要在代码中手动要求它。

require: false告诉Bundler。Require不需要特定的宝石:必须通过Require 'gem'明确地需要宝石。

此选项不影响:

Bundle安装:无论如何gem都会被安装 要求搜索路径设置由捆绑。 Bundler添加东西到路径,当你做任何一个: Bundle.setup 它被require bundler/setup调用 它被bundle exec调用

例子

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.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

那么下面的代码不会引发异常:

bundle install --path=.bundle
bundle exec ruby main.rb

你可以在GitHub上玩。

Rails使用

正如在初始化教程中所解释的,默认的Rails模板在启动时运行:

配置/ boot.rb 配置/ application.rb

配置/ boot。rb包含:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

它需要'bundler/setup'并设置require路径。

配置/应用程序。rb:

Bundler.require(:default, Rails.env)

这实际上需要宝石。