web-dev-qa-db-ja.com

なぜ「必要な 'バンドル/セットアップ'」が必要なのですか?

私が見たほとんどすべてのシナトラの例では、それが何をするかにかかわらず、常に次の2行があります。

require 'rubygems'
require 'bundler/setup'

ほとんどの例では、「bundler/setup」requireを削除しても破壊効果はないように思われるため、これをいつ/どこに含める必要があるかについて混乱しています。

私はそこにある理由を正確に知らずに物を使うのが嫌いなので、誰かが私が両方の線を必要とする理由とそれらが何をするのかを説明してくれることを望んでいましたか?

28
Martin

これにより、Gemfileで定義されたgemを確実にロードできます。こちらのドキュメントをご覧ください https://bundler.io/v1.12/bundler_setup.html

16
lucapette

実用的な説明があります:

Githubマスターブランチのpristine_textというgemを使用するとします。

Gemfile:

gem "pristine_text", github: "nurettin/pristine_text"

main.rb :(間違った)

require "pristine_text"
# error, can't find pristine_text

宝石がパスにないため、requireはそれを見つけることができませんRuby見ることができます。宝石の実際のパスを見ると、下にあることがわかります

/pristine-text-some_commit_id

main.rb :(右)

require "bundler/setup"
require "pristine_text"
# no error

依存関係のロードパスを使用してバンドラーをロードするため、エラーはなくなりました。

8
nurettin

Bundlerのセットアッププロセスを理解する

Brian Stortiは、Bundlerのセットアップで見つけることができる最高の記事を書きました-引用元から引用しています

何が起こっているのかを理解する

簡単に言うと、Bundlerが行っているのは、Gemfileで定義されていないすべてのものを$ LOAD_PATHから削除することです。 $ LOAD_PATH(または単に$ :)は、必要なものを探す場所をRubyに指示するグローバル変数であるため、依存関係がGemfileにない場合は、次のようにはなりません。 $ LOAD_PATHで、Rubyはそれを見つける方法がありません。

コードを見せて

This は、「bundler/setup」が必要なときにロードされるファイルであり、ここで重要なのは Bundler.setup 呼び出しです。この設定は、最初に ロードパスをクリーンアップ 、次に アクティブ化 Gemfileで定義されているgemのみを意味します。つまり、基本的に $ LOAD_PATH変数に追加する

注:変更されたマスターブランチに移動するときに、「コードを表示」リンクを更新しました。

4
not a patch

バンドルセットアップはロードパスを「クリア」するため、Gemfileにないものを要求しようとすると、ロードエラーが発生します。

4
Shamaoke