Bundler如何工作?

时间:2012-05-03 16:15:16

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems bundler

这个问题是关于bundler,rubygems&它是如何确定我调用的方法。它很长,所以请耐心等待。

根据我的理解,Bundler是一个用于管理ruby的gem的依赖管理工具。它安装所有的宝石和&他们的依赖关系列在Gemfile中。

我想问的问题可以用一个例子来说明。所以这里 - >在我的rails应用程序中,我在我的控制器中执行此操作: -

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

在这里,我做了两件事:

  1. 包含Surveyor gem中的SurveyorControllerMethods
  2. 由于我在这里使用 super ,它会调用create方法 SurveyorControllerMethods工作正常,但我没有 理解它。
  3. 并且宝石安装在

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

    令人惊讶的是,在红宝石的$LOAD_PATH中并不存在。所以问题是:

    1. 它是如何工作的?
    2. 使用bundler安装gem,在安装过程中幕后会发生什么?
    3. 我们甚至不需要在我们的代码和代码中包含/调用它们的ex jquery-rails。然而,自动包含jQuery JavaScript文件。我知道它不是魔术,所以它是如何工作的?

1 个答案:

答案 0 :(得分:2)

他们的关键在于如何开箱即用Rails。这也是Rails开始大型项目的原因之一。[1]

在boot.rb中你会找到:

require 'bunder/setup'

在application.rb的顶部你会找到:

Bundler.require(:default, :development)

最后一个方法调用回溯到你的Gemfile,然后迭代所有的所有组中的宝石(上面的:default:development)。然后,它会确定应该加载的默认文件是什么,通常是gem名称,但也可以由:require选项指定。 Bundler也有一些内置的命名约定异常,例如处理“ - ”而不是“_”。

Bundler然后只加载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行并且只需要宝石就不会那么慢。