Gemfile中的“ require:false”是什么意思?


428

做这个:

gem 'whenever', require: false

意味着需要安装gem,或者是否不需要?


1
Bundler.require据我所知,大多数答案(包括已接受的答案)都是关于Rails的,这些默认情况下是默认的。只有Ciro和Nesha的答案是正确的。
Nakilon

Answers:


472

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

require "whenever"

如果您想使用该库。

如果你要做

gem "whenever", require: "whereever"

然后捆绑程序会随时下载命名的gem,但会调用

require "whereever"

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


112
@VenkatD。有时您想安装某些gem,但又不想将它们加载到每个进程中。我有一个特定的rake任务,我想通过其计划的插件在Heroku上定期调用。这项特定的rake任务需要其他应用程序不需要的宝石。因此,我将:require => false这些特殊的宝石明确地require "thegem"从rake任务中删除。这样可以节省主应用程序进程中的内存和启动时间等。但是,即使您在每个进程中都需要这些其他的gem,也不会影响应用程序的性能。
Michael van Rooijen 2012年

5
@MichaelvanRooijen-但是,要点是:“但是,即使您在每个过程中都需要这些额外的工具,也不会影响应用程序的性能”。我认为那不是真的。根据confreaks.com/videos/2668-gogaruco2013-measuring-ruby
Nathan Long

1
@MichaelvanRooijen-实际上,您是对的,除非您使用该库,否则通常并不重要。但是,需要gem至少会将其主文件加载到lib中,并且可能需要做更多的工作。即使您require 'yaml'已经将YAML模块作为对象存储在内存中。
内森·朗

2
如果您想将require设置为false并且库名也不同于gem名称,该怎么办?
Peter-Jan Celis 2014年

2
@ Peter-JanCelis在这种情况下,您只需进行设置:require => false,然后在代码中添加require 'library_name_here'
Rob Di Marco

73

您可以使用:require => false,当你想要安装的宝石而不是“要求”。

因此,在示例中,您给出了: gem 'whenever', :require => false 当某人运行bundle时,安装when时将与一起安装gem install whenever。每当用于通过运行rake任务来创建cron作业时,通常不从Rails(或其他框架,如果不是Rails)应用程序中使用它。

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


6
这也可以用于仅在一小部分请求中使用的gem。
内森·朗

61

require: false告诉Bundler.require您不需要该特定的gem:必须通过显式要求该gem require 'gem'

该选项并不会影响:

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

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

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

    • Bundle.setup
    • 被称为 require bundler/setup
    • 被称为 bundle exec

宝石文件

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模板在启动时运行:

  • 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)

实际上需要宝石。


请注意,使用require 'faker可能未使用正确的gem版本,特别是如果您是Gemfile指向git ref。
dazonic

@dazonic与Haml的示例有何不同?
西罗Santilli郝海东冠状病六四事件法轮功

9

每当您在Gemfile运行中指定Gem时 bundle install,bundler都会通过在您的应用中安装指定的gem并为该Gem加载代码,通过 require 'whenever'这种方式,bundler将在Rails应用中加载所有Gems的代码,并且您可以调用任何方法像大多数时候一样,从任何宝石中轻松摆脱痛苦。

但是类似Gems whenever, faker or capistrano 的东西在您的应用程序代码中是不需要的,只要schedule.rb 文件中的代码用于管理文件中的Cron和Capistrano代码deploy.rb 以自定义部署配方,就不需要在您的应用程序代码中以及任何地方加载这些gems的代码要调用这些Gems中的任何方法,您可以通过手动手动要求这些宝石 require "whenever" 。因此:require => false,您为这些Gems 放入了Gemfile,这样,捆绑程序将安装该Gem但不为该Gem本身加载代码,您可以在任何需要的地方进行操作,只需在需要的情况下简单地放入require'whenever'。


2

为了在您的Gemfile中需要gem,您需要致电Bundler.require

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.