[英]How does bundler work?
這個問題是關於bundler,rubygems以及它如何確定我調用的方法。 它很長,所以請耐心等待。
根據我的理解,Bundler是一個用於管理ruby的gem的依賴管理工具。 它安裝Gemfile
列出的所有gem及其依賴Gemfile
。
我想問的問題可以用一個例子來說明。 所以這里 - >在我的rails應用程序中,我在我的控制器中執行此操作: -
module SurveyorControllerCustomMethods
def create
super
end
end
class SurveyorController < ApplicationController
include Surveyor::SurveyorControllerMethods
end
在這里,我做兩件事:
SurveyorControllerMethods
從測量師的寶石。 SurveyorControllerMethods
調用create
方法,它工作正常,但我不明白。 寶石安裝在
$ bundle show surveyor
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0
令人驚訝的是,它不存在於ruby的$LOAD_PATH
。 所以問題是:
jquery-rails
,我們甚至不必在我們的代碼中包含/調用它們,但是,jQuery JavaScript文件會自動包含在內。 我知道它不是魔術,所以它是如何工作的? 它們的關鍵在於如何開箱即用Rails。 這也是Rails開始大型項目的原因之一。[1]
在boot.rb中你會發現:
require 'bunder/setup'
在application.rb的頂部你會發現:
Bundler.require(:default, :development)
最后一個方法調用回溯到您的Gemfile,然后迭代給定組中的所有 gem( :default
和:development
上面的:development
)。 然后它確定應該加載的默認文件是什么,通常是gem名稱,但也可以通過:require
選項指定。 Bundler也有一些內置的命名約定異常,例如處理“ - ”而不是“_”。
Bundler然后只加載gem的主文件,然后(通常)加載gem內的文件。
'bundler/setup'
文件執行Bundler.setup
,它負責加載路徑。 它為每個gem的$LOAD_PATH
(取消)。 關於那些加載路徑應該是什么的實際信息來自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行並且只需要寶石,它就不會那么慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.