Ruby 鲁比:什么是';require:false';你的意思是?

Ruby 鲁比:什么是';require:false';你的意思是?,ruby,bundler,gemfile,Ruby,Bundler,Gemfile,这是否: gem 'whenever', require: false 这意味着需要安装gem,还是说它不是必需的?这意味着安装gem,但在启动Bundler时不要调用require。因此,您需要手动调用 require "whenever" 如果你想使用图书馆 如果你要做 gem "whenever", require: "whereever" 然后bundler会下载名为where的gem,但会调用 require "whereever" 如果需要的库的名称与gem的名称不同,则通常

这是否:

gem 'whenever', require: false

这意味着需要安装gem,还是说它不是必需的?

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

require "whenever"
如果你想使用图书馆

如果你要做

gem "whenever", require: "whereever"
然后bundler会下载名为where的gem,但会调用

require "whereever"

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

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

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


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

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

此选项不影响:

  • bundle install
    :不管怎样,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
让你玩它

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'])
需要“bundler/setup”
并设置所需路径

config/application.rb
执行以下操作:

Bundler.require(:default, Rails.env)

这实际上需要Gem。

每当您在
Gem文件中指定Gem并运行
bundle install
时,bundler就会在您的应用程序中安装指定的Gem并加载该Gem的代码,方法是将
require'where'
这样bundler就会在您的Rails应用程序中加载所有Gem的代码,您可以从任何Gem调用任何方法,而无需任何痛苦,就像大多数时候一样

但是像
where、faker或capistrano
这样的gem是你在应用程序代码中不需要的东西,你需要
schedule.rb
文件中的where代码来管理
deploy.rb
文件中的cron和capistrano代码来定制部署方法,这样你就不需要在应用程序代码中加载这些gem的代码
无论您想从这些gem中调用任何方法,您都可以通过在
require“where”
中放置
require来手动请求这些gem。因此,您将
:require=>false
放在Gem文件中,用于这些Gem,这样bundler将安装该Gem,但不会加载该Gem本身的代码,您可以在任何时候执行此操作,只需在您的案例中添加类似require的“where”即可。

为了在Gem文件中要求Gem,您需要调用
bundler.require


您可以使用
require:false
防止bundler需要gem,但它仍将安装和维护gem。查看更详细的解释。

@VenkatD。有时,您希望安装某些gem,但不希望将它们加载到每个进程中。我有一个特殊的rake任务,我想通过Heroku的调度插件定期调用它。这个特殊的rake任务需要应用程序其余部分不需要的某些gem。因此,我
:require=>false
这些特定的gem,并且明确地
需要rake任务中的“thegem”
。这将节省主应用程序进程中的内存和启动时间等。但是,即使您在每个进程中都需要这些额外的gem,应用程序性能也不应受到影响。@MichaelvanRooijen-但是,要点很好:“但是,即使您在每个进程中都需要这些额外的gem,应用程序性能也不应受到影响”。我认为那不是真的。根据@MichaelvanRooijen的说法,分配对象需要工作,GC每次都必须遍历所有对象,因此more=更慢-实际上,你是对的,除非你使用库,否则通常都不重要。但需要一个gem至少会在lib中加载它的主文件,而且可能它自己需要更多。即使您
需要“yaml”
,现在,您将
YAML
模块作为内存中的一个对象。如果您想将require设置为false,并且库名称也与gem名称不同,该怎么办?@Peter JanCelis在这种情况下,您只需设置
:require=>false
,然后在您的代码中有一个
require'library\u name\u here'
这也可以用于gem您只在一小部分请求中使用。请注意,使用
require'faker
可能不会使用正确的gem版本,特别是如果您是Gemfile指向git ref.@dazonic Haml在示例中有什么不同吗?大多数答案(包括已接受的答案)都是关于执行
绑定器的Rails。据我所知,默认情况下require
。只有西罗和奈莎的答案是正确的。