Ruby: '需要什么:false'Gemfile的意思是?

这样做:

gem 'whenever', require: false

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

85779 次浏览

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

require "whenever"

如果你想去图书馆的话。

如果你要这么做

gem "whenever", require: "whereever"

然后捆绑者将下载宝石命名,但会调用

require "whereever"

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

当你想要安装gem但不是“必需的”时,使用:require => false

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

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

require: false告诉Bundler.require不需要特定的宝石:必须通过require 'gem'显式地需要该宝石。

这个选项会影响:

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

  • 绑定器设置的require搜索路径。

    Bundler添加东西到路径,当你做任何一个:

    • Bundle.setup
    • require bundler/setup调用
    • bundle exec调用
    • 李< / ul > < / >

    例子

    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
    

    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'并设置require路径。

    config/application.rb:

    Bundler.require(:default, Rails.env)
    

    这实际上需要宝石。

当你在你的Gemfile中指定一个Gem并运行__abc1时,bundler就会安装指定的Gem并通过require 'whenever'在你的应用程序中加载该Gem的代码,这样bundler就会在你的Rails应用程序中加载所有Gem的代码,并且你可以从任何Gem中调用任何方法,就像你大多数时候做的那样,没有任何痛苦。

但是像whenever, faker or capistrano 这样的Gems在你的应用程序代码中是不需要的,你需要在你的schedule.rb 文件中的代码来管理crons和deploy.rb 文件中的capistrano代码来自定义部署配方,所以你不需要在你的应用程序代码中加载这些Gems的代码 无论你想从这些Gems中调用任何方法,你都可以通过放置 require "whenever" 来手动调用这些Gems。所以你把:require => false放在你的Gemfile为这些宝石,这样捆绑器将安装该宝石,但不加载代码为该宝石本身,你可以这样做,只要你想在你的情况下,简单地要求'每当'。

为了在你的Gemfile中需要gems,你需要调用Bundler.require

你可以通过require: false来防止捆绑器要求gem,但是它仍然会安装和维护gem。查看这一点以获得更详细的解释。

类比解释

## Gemfile
gem "university_degree", require: false
gem "dealing_with_boss"
  • < p >“dealing_with_boss"-总是需要-加载到内存并准备好了。

  • 我很少需要程度宝石。只有在我和招聘人员谈话的时候。所以我手动require它,然后突然有了像“Black Scholes-Merton"和“;heteroskadasticity"立即准备好;我告诉招聘人员,我可以做“冒泡排序”。