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

raf*_*mvc 410 ruby bundler gemfile

做这个:

gem 'whenever', require: false
Run Code Online (Sandbox Code Playgroud)

是指宝石需要安装,还是意味着它不是必需的?

Rob*_*rco 458

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

require "whenever"
Run Code Online (Sandbox Code Playgroud)

如果你想使用这个库.

如果你这样做的话

gem "whenever", require: "whereever"
Run Code Online (Sandbox Code Playgroud)

然后捆绑包会下载任何时候命名的宝石,但会打电话

require "whereever"
Run Code Online (Sandbox Code Playgroud)

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

  • @VenkatD.有时你想安装某些宝石但你不想将它们加载到每个进程中.我有一个特殊的rake任务,我想通过他们的scheduleler附件在Heroku上定期调用.这个特殊的rake任务需要一些其他应用程序不需要的宝石.所以我`:require => false`这些特殊的宝石,并从rake任务中明确地"要求"thegem"`.这样可以节省主应用程序进程和启动时间等内存.但是,即使您在每个进程中都需要这些额外的宝石,也不应影响应用程序性能. (106认同)
  • @MichaelvanRooijen - 不过要点:"即使你在每个过程中都需要这些额外的宝石,应用程序的性能也不会受到影响".我认为这不是真的.根据http://confreaks.com/videos/2668-gogaruco2013-measuring-ruby,分配对象需要工作,GC必须每次运行所有这些,所以更多=更慢. (5认同)
  • 如果要将require设置为false并且库名称与gem名称不同,该怎么办? (2认同)
  • @ Peter-JanCelis在这种情况下你只需要设置`:require => false`然后在你的代码中有一个`require'counk_name_here'` (2认同)

gdu*_*duq 71

:require => false希望安装gem时使用,但不是"必需".

所以在你给出的例子中: gem 'whenever', :require => false 当有人运行bundle install时,就会安装gem gem install whenever.每当用于通过运行rake任务来创建cron作业,但通常不在rails(或其他框架,如果不是rails)应用程序中使用.

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

  • 这也可以用于仅在一小部分请求中使用的gem. (6认同)

Cir*_*四事件 56

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

该选项并不会影响:

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

  • require由bundler设置的搜索路径.

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

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

的Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

那么以下内容不会引发异常:

bundle install --path=.bundle
bundle exec ruby main.rb
Run Code Online (Sandbox Code Playgroud)

在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'])
Run Code Online (Sandbox Code Playgroud)

它执行require 'bundler/setup'并设置require路径.

config/application.rb 作用:

Bundler.require(:default, Rails.env)
Run Code Online (Sandbox Code Playgroud)

这实际上需要宝石.

  • 这是一个很好的信息来源.谢谢! (3认同)

Sub*_*dra 8

每当你在你的Gemfile运行中指定一个Gem时 bundle install,bundler就会通过put来为你的应用程序中的Gem安装指定的gem和加载代码 require 'whenever',这样,bundler将为你的Rails应用程序中的所有Gem加载代码,你可以调用任何来自任何宝石的方法没有任何痛苦,就像你大部分时间一样.

但宝石之类whenever, faker or capistrano 的东西是您在应用程序代码中不需要的东西,只要您的schedule.rb 文件中的代码管理文件中的crons和capistrano代码deploy.rb 以自定义部署配方,您就不需要在应用程序代码中加载这些宝石的代码,无论您在何处想要从这些宝石中调用任何方法,您可以自己手动要求这些宝石 require "whenever" .所以你把:require => falseGem文件放到这些Gems中,这样捆绑包就会安装那个Gem而不是加载Gem本身的代码,你可以随时在你的情况下像需要'随时'那样做.


BKS*_*eon 6

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss" 
Run Code Online (Sandbox Code Playgroud)
  • dealing_with_boss” - 加载到内存中并准备就绪。

  • degree gem- 不是“需要”......您需要手动require才能使用它。