Bundler:在Gemfile中,require:> false是什么意思?

线是这一个:

gem 'whenever', :require => false 

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

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

 require "whenever" 

如果你想使用库。

如果你这样做

 gem "whenever", :require=>"whereever" 

那么捆绑器会下载每当任何时候命名的gem,但会打电话

 require "whereever" 

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

你可以使用:require => false当你想要安装gem而不是“required”时。

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

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

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

该选项不会影响:

  • bundle install :无论如何,gem将被安装

  • 由bundler设置的requiresearchpath。

    Bundler将以下任一项添加到path中:

    • 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 

那么下面不会引发exception:

 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'并设置需求path。

config/application.rb确实:

 Bundler.require(:default, Rails.env) 

这实际上需要gem。

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

但是像whenever,faker or capistrano这样的gem是你在你的应用程序代码中不需要的东西,只要你的schedule.rb文件中的代码需要在deploy.rb文件中pipe理cron和capistrano代码来定制部署配方,所以你不需要加载在你的应用程序代码中的这些gem代码,无论你想从这些gem调用任何方法,你可以手动要求这些gem自己通过把require "whenever" 。 所以你把gemfile中的:require => false放在这些Gem中,这样bundler将会安装这个Gem,但是不会为这个Gem本身加载代码,你可以在任何时候通过简单地将require'