Bundler如何工作?

Cur*_*ind 5 ruby rubygems ruby-on-rails bundler ruby-on-rails-3

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

根据我的理解,Bundler是一个用于管理ruby的gem的依赖管理工具.它安装了所有的gems及其依赖项Gemfile.

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

module SurveyorControllerCustomMethods
  def create
    super
  end
end
class SurveyorController < ApplicationController
   include Surveyor::SurveyorControllerMethods
end
Run Code Online (Sandbox Code Playgroud)

在这里,我做两件事:

  1. 包括SurveyorControllerMethodsSurveyor gem.
  2. 正如我在这里使用超级,它会调用create方法, SurveyorControllerMethods但是我不理解它.

宝石安装在

$ bundle show surveyor
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0
Run Code Online (Sandbox Code Playgroud)

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

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

d11*_*wtq 2

它们的关键实际上在于 Rails 是如何开箱即用的。这也是 Rails 在大型项目上启动如此缓慢的原因之一。[1]

在 boot.rb 中你会发现:

require 'bunder/setup'
Run Code Online (Sandbox Code Playgroud)

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

Bundler.require(:default, :development)
Run Code Online (Sandbox Code Playgroud)

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

然后,Bundler 只需加载 gem 的主文件,然后(通常)加载 gem 内的文件。

'bundler/setup'文件执行Bundler.setup,它负责加载路径。它为每个宝石添加(未移位)到$LOAD_PATH。有关这些加载路径的实际信息应来自 ruby​​gems。

看一下源码:

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,您可能会发现随着时间的推移,它不会变得那么慢。