6

この質問は、bundler、rubygems、および私が呼び出しているメソッドをどのように把握するかについてです。かなり長いので、ご容赦ください。

私の理解によると、Bundlerはrubyのgemを管理するための依存関係管理ツールです。にリストされているすべてのgemとその依存関係をインストールしますGemfile

私が聞きたい質問は、例で最もよく説明できます。だからここで->私のrailsアプリでは、コントローラーでこれを行っています:-

module SurveyorControllerCustomMethods
  def create
    super
  end
end
class SurveyorController < ApplicationController
   include Surveyor::SurveyorControllerMethods
end

ここでは、2つのことを行っています。

  1. SurveyorControllerMethodsSurveyorの宝石から含めます。
  2. 私はここでスーパーを使用したので、それはうまく機能するcreateメソッド を呼び出すでしょうが、私はそれを理解していません。SurveyorControllerMethods

宝石はにインストールされています

$ bundle show surveyor
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0

驚くべきことに、これはルビーには存在しません$LOAD_PATH。だから質問は:

  1. それはどのように機能しますか?
  2. bundlerを使用してgemをインストールします。インストール中に舞台裏で何が起こりますか?
  3. コードに含める/呼び出す必要がないgemesexがいくつかありjquery-railsますが、jQueryJavaScriptファイルは自動的に含まれます。私はそれが魔法ではないことを知っています、それでこれはどのように機能しますか?
4

1 に答える 1

2

それらの鍵は、実際にはRailsが箱から出してどのようにセットアップされるかにあります。これは、Rails が大規模なプロジェクトで開始するのが非常に遅い理由の 1 つでもあります[1]。

boot.rb には次のものが含まれます。

require 'bunder/setup'

そして、application.rb の上部に次のものが見つかります。

Bundler.require(:default, :development)

この最後のメソッド呼び出しは、Gemfile に戻り、指定されたグループ (および上記) にあるすべての gem を反復処理します。次に、ロードする必要があるデフォルトのファイルを決定するのに苦労します。これは通常、gem 名ですが、オプションで指定することもできます。Bundler には、"_" の代わりに "-" を使用するなど、組み込みの命名規則の例外もあります。:default:development:require

その後、Bundler は gem のプライマリ ファイルをロードするだけで、次に (通常は) gem 内のファイルをロードします。

'bundler/setup'ファイルはBundler.setup、ロード パスを処理する を実行します。$LOAD_PATHfor each gemの先頭に追加 (シフト解除) します。これらのロード パスがどうあるべきかについての実際の情報は、rubygems から得られます。

次のソースを見てください。

https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb https://github.com/carlhuda/bundler/blob/master/lib/bundler/runtime.rb

[1]: 新しい Rails プロジェクトを開始するときは、Bundler.require 行を削除して、必要に応じて gem を単に require するだけで、時間の経過とともにそれほど遅くならないことに気付くでしょう。

于 2012-05-03T16:30:38.777 に答える