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


429

これを行います:

gem 'whenever', require: false

宝石をインストールする必要があるという意味ですか、それとも必要ないという意味ですか?


1
ほとんどの答え(受け入れられたものを含む)はBundler.require、私が理解しているようにデフォルトでを行うRailsに関するものです。チロとネシャの答えだけが正しいです。
Nakilon、2018

回答:


472

つまり、gemをインストールしますが、Bundlerを起動するときにrequireを呼び出さないでください。したがって、手動で呼び出す必要があります

require "whenever"

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

もしあなたがやるなら

gem "whenever", require: "whereever"

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

require "whereever"

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


112
@VenkatD。特定のgemをインストールしたいが、すべてのプロセスにロードしたくない場合があります。Herokuで定期的なアドオンを使用して定期的に呼び出す特定のRakeタスクがあります。この特定のRakeタスクには、アプリケーションの残りの部分では必要とされない特定のGemが必要です。だから私は:require => falseこれらの特定のジェムと明示的require "thegem"にレイクタスクからです。これにより、メインのアプリプロセスや起動時間などのメモリが節約されます。ただし、すべてのプロセスでこれらの追加のgemが必要になった場合でも、アプリのパフォーマンスには影響しません。
Michael van Rooijen

5
@MichaelvanRooijen-素晴らしい点:ただし、「すべてのプロセスでこれらの追加のgemが必要になったとしても、アプリのパフォーマンスは影響を受けないはずです」。それは本当ではないと思います。confreaks.com/videos/2668-gogaruco2013-measuring-ruby
Nathan Long

1
@MichaelvanRooijen-実際には、あなたが正しい、ライブラリを使用しない限り、それは一般的に重要ではありません。ただし、gemを要求すると、少なくともメインファイルがlibにロードされ、おそらくそれ自体がさらに必要になります。場合でもrequire 'yaml'YAMLモジュールをメモリ内のオブジェクトとして使用できます。
Nathan Long

2
requireをfalseに設定し、ライブラリ名もgem名と異なる場合はどうなりますか?
Peter-Jan Celis 14年

2
@ Peter-JanCelisその場合、設定するだけ:require => falseで、コードにrequire 'library_name_here'
Rob Di Marco

73

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

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

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


6
これは、リクエストの小さなサブセットでのみ使用する宝石にも使用できます。
Nathan Long

61

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

このオプションは影響しません。

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

  • requireバンドラーによって設定された検索パス。

    次のいずれかを実行すると、バンドラーはパスに物事を追加します。

    • 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の使用法

初期化チュートリアルで説明されているように、デフォルトの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'により、必要なパスが設定されます。

config/application.rb します:

Bundler.require(:default, Rails.env)

実際には宝石が必要です。


require 'faker特にGemfileがgit refを指している場合は、使用すると正しいgemバージョンが使用されない場合があることに注意してください。
dazonic

@dazonicは、例ではHamlに違いがありますか?
Ciro Santilli郝海东冠状病六四事件法轮功

9

でGemを指定してGemfile実行すると bundle install、Bundlerは指定されたGem をインストールし、アプリにそのGemの require 'whenever'コードをロードします。ほとんどの場合と同じように、どのGemからでも痛みはありません。

しかし、宝石が好きでwhenever, faker or capistrano 、あなたのコードいつでもあなたが必要とするアプリのコードにする必要はありません、何かされschedule.rb たファイルがでcronsとカピストラーノコードを管理するためにdeploy.rb 、ファイルアプリのコードにこれらの宝石の負荷コードにする必要はありませんので、展開のレシピをカスタマイズすることをしてどここれらの宝石から任意のメソッドを呼び出したい場合は、自分で手動でこれらの宝石を要求できます require "whenever" 。したがって:require => false、これらの宝石のGemfileを入力すると、この方法でバンドラーはそのGemをインストールしますが、そのGem自体のコードはロードしません。ケースにrequire 'whenever'のように置くだけで、いつでも好きなときにそれを実行できます。


2

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

でbundlerがgemを必要としないようにすることができますが、gemはrequire: falseインストールされ、維持されます。チェックこのアウトをより詳細な説明のため。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.