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

时间:2011-01-26 01:46:42

标签: ruby bundler gemfile

这是:

gem 'whenever', require: false

是指需要安装gem,还是意味着不需要?

5 个答案:

答案 0 :(得分:445)

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

require "whenever"

如果你想使用这个库。

如果你要做

gem "whenever", require: "whereever"

然后bundler会下载名为的宝石,但会调用

require "whereever"

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

答案 1 :(得分:69)

如果希望安装gem而不是“必需”,则使用:require => false

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

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

答案 2 :(得分:54)

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

此选项影响:

  • bundle install:无论

  • ,都会安装gem
  • 由bundler设置的require搜索路径。

    当您执行以下任一操作时,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

On GitHub让你玩它。

Rails使用

initialization tutorial中所述,默认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'并设置require路径。

config/application.rb

Bundler.require(:default, Rails.env)

实际上需要宝石。

答案 3 :(得分:8)

每当您在Gemfile中指定Gem并运行 bundle install时,bundler将通过放置require 'whenever' 并在此应用中为该Gem安装指定的gem和加载代码,这样捆绑将在你的Rails应用程序中加载所有Gems的代码,你可以毫不费力地从任何Gem调用任何方法,就像你大部分时间一样。

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

答案 4 :(得分:1)

为了在Gemfile中需要gems,您需要调用require: false

您可以阻止bundler要求使用int (*p[3])(int, double); 的gem,但它仍然会安装和维护gem。请查看this out以获取更详细的说明。