web-dev-qa-db-ja.com

Gemfileの 'require:false'はどういう意味ですか?

これを行います:

gem 'whenever', require: false

gemをインストールする必要があるということですか、それとも必要ではないということですか?

397
rafamvc

これは、gemをインストールすることを意味しますが、Bundlerの起動時にrequireを呼び出さないでください。そのため、手動で呼び出す必要があります

require "whenever"

ライブラリを使用する場合。

あなたがする場合

gem "whenever", require: "whereever"

バンドラーはいつでもgemという名前をダウンロードしますが、

require "whereever"

これは、必要なライブラリの名前がgemの名前と異なる場合によく使用されます。

447
Rob Di Marco

Gemをインストールするが「必須」ではない場合は、:require => falseを使用します。

だからあなたが与えた例では:gem 'whenever', :require => false誰かがbundle installを実行すると、gem install wheneverのようにgemがインストールされるたびにインストールします。 rakeタスクを実行してcronジョブを作成するために使用されますが、通常Rails(またはRailsでない場合は他のフレームワーク)アプリケーションからは使用されません。

そのため、コマンドラインから実行する必要があるがコード内で必要のないものには:require => falseを使用できます。

69
gduq

require: falseは、特定のgemを要求しないようにBundler.requireに指示します。gemはrequire 'gem'を介して明示的に要求する必要があります。

このオプションは、notには影響しません:

  • bundle install:gemは関係なくインストールされます

  • バンドラーによる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

GitHubで 試してみてください。

レールの使用法

初期化チュートリアル で説明されているように、デフォルトの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を指定し、bundle installを実行するたびに、Bundlerは、このようにrequire 'whenever'を配置することで、指定したgemをインストールし、そのGemのコードをロードしますRails appを使用すると、ほとんどの場合と同様に、どのGemからでも苦痛なくメソッドを呼び出すことができます。

whenever, faker or capistranoのようなGemsは、schedule.rbファイル内のcronとcapistranoコードを管理するためにdeploy.rbファイル内のコードが必要なものではないため、アプリケーションコードでこれらのgemのコードをロードする必要がないため、そして、これらのGemからメソッドを呼び出したい場所ならどこでも、require "whenever"を置くことで自分で手動でこれらのGemを要求することができます。これらのGemsのGemfileに:require => falseを配置すると、この方法でbundlerはGemをインストールしますが、Gem自体のコードはロードしません。必要に応じて、単に 'whenever'をケースに入れて実行できます。

8
Subhash Chandra

Gemfileでgemを要求するには、Bundler.requireを呼び出す必要があります。

require: falseを使用して、Bundlerがgemを要求するのを防ぐことができますが、引き続きgemをインストールして維持します。詳細な説明については、 this out を確認してください。

1
Nesha Zoric