463

做这个:

gem 'whenever', require: false

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

4

6 回答 6

499

这意味着安装 gem,但在启动 Bundler 时不要调用 require。所以你需要手动调用

require "whenever"

如果你想使用图书馆。

如果你要做

gem "whenever", require: "whereever"

然后 bundler 会随时下载命名的 gem,但会调用

require "whereever"

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

于 2011-01-26T01:51:03.653 回答
81

当您:require => false希望安装 gem 但不是“必需”时使用。

因此,在您给出的示例中: gem 'whenever', :require => false 当有人运行 bundle install 时,将像使用gem install whenever. When 用于通过运行 rake 任务来创建 cron 作业,但通常不在 rails(或其他框架,如果不是 rails)应用程序中使用。

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

于 2011-01-26T02:55:53.857 回答
70

require: false告诉Bundler.require不要求特定的宝石:必须通过明确要求宝石require 'gem'

此选项不影响

  • bundle install:无论如何都会安装gem

  • 捆绑器设置的require搜索路径。

    当您执行以下任一操作时,Bundler 会将内容添加到路径中:

    • 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

在 GitHub 上供您使用。

导轨使用

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

  • config/boot.rb
  • config/application.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)

这实际上需要宝石。

于 2014-01-10T13:45:57.040 回答
17

每当您在Gemfileand run中指定一个 Gem 时 bundle install,bundler 将去安装指定的 gem 并在您的应用程序中加载该 Gem 的代码, require 'whenever'这样 bundler 将在您的 Rails 应用程序中加载所有 Gems 的代码,并且您可以调用任何方法任何宝石都没有任何痛苦,就像你大部分时间一样。

但是像 Gems 这样whenever, faker or capistrano 的东西是您的应用程序代码中不需要的东西,只要文件中的代码schedule.rb 用于管理文件中的 crons 和 capistrano 代码deploy.rb 以自定义部署配方,因此您无需在应用程序代码中以及在任何地方加载这些 gems 的代码想要从这些 Gems 中调用任何方法,您可以通过 put 手动要求这些 Gems require "whenever" 。因此,您将:require => falseGemfile 放入这些 Gem,这样捆绑程序将安装该 Gem,但不会加载该 Gem 本身的代码,您可以随时通过简单地在您的情况下输入 like require 'whenever' 来执行此操作。

于 2016-02-26T08:03:47.507 回答
2

为了在您的 Gemfile 中要求 gems,您需要调用Bundler.require.

您可以使用 来阻止捆绑程序要求 gem require: false,但它仍会安装和维护 gem。查看内容以获得更详细的说明。

于 2018-03-09T15:30:10.730 回答
1

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss"
  • dealing_with_boss” - 总是需要 - 加载到内存中并准备就绪。

  • 我很少需要学位宝石。只有当我与招聘人员交谈时。所以我手动操作require它,突然之间像“Black Scholes-Merton”和“heteroskadasticity”这样的花哨的词立即被加载到内存中;我告诉招聘人员我可以进行复杂的排序算法:例如,三种不同语言的“冒泡排序”:Javascript、EcmaScript 和 ES16——看看我有多聪明——这通常足以让我与其他人交谈。

于 2021-11-16T23:41:11.537 回答