2012-05-03 74 views
5

这个问题是关于捆绑器,rubygems &它是如何找出我打电话给我的方法。它相当长,所以请忍受我。捆绑机如何工作?

根据我的理解,Bundler是一个管理ruby的gems的依赖管理工具。它会安装Gemfile中列出的所有其他依赖关系的宝石&。

我想问的问题可以通过一个例子来最好地说明。这里

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

,我做了两两件事:

  1. 包括从勘测宝石SurveyorControllerMethods - :所以在这里 - >在我的Rails应用程序,我在我的控制器这样做。
  2. 正如我已经使用超级在这里,它会调用create方法从 SurveyorControllerMethods这工作得很好,但我不 理解。

和创业板被安装在

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

其令人惊讶地没有出现在Ruby的$LOAD_PATH。所以问题是:

  1. 它甚至如何工作?
  2. 使用捆绑器安装gem,安装过程中幕后发生了什么?
  3. 有一些宝石ex jquery-rails,我们甚至不需要在我们的代码&中包含/调用它们,但jQuery JavaScript文件自动包含在其中。我知道它不是魔术,所以这是如何工作的?

回答

2

他们的关键实际上是Rails是如何设置开箱的。这也是Rails在大型项目上开始如此缓慢的原因之一。[1]

在的boot.rb,你会发现:

require 'bunder/setup' 

,并在application.rb中的顶部,你会发现:

Bundler.require(:default, :development) 

这最后一个方法调用看起来返回到您的Gemfile,然后重复给定组(上述中的:default:development)的所有宝石中的。然后,它需要确定应该加载哪个默认文件,这通常是宝石名称,但也可以通过:require选项指定。 Bundler也有一些内置的命名约定例外,例如处理“ - ”而不是“_”。

Bundler然后只是加载gem的主文件,gem又会(通常)加载gem中的文件。

'bundler/setup'文件执行Bundler.setup,它负责处理加载路径。它预先(不移动)到每个宝石的$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行,并且只是在需要的时候需要gems,你可能会发现它随着时间的推移不会变得如此缓慢。

+0

我在'config/boot.rb'或'config/application.rb'找不到'Bundler.setup(:default,:development)'? – CuriousMind

+0

糟糕,我很抱歉,它需要'bundler/setup',这是间接的做法https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb – d11wtq