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设置的
require
searchpath。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'