6

这个问题是关于捆绑器、rubygems 以及它如何确定我正在调用的方法。它很长,所以请多多包涵。

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

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

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

在这里,我正在做两件事:

  1. 包括SurveyorControllerMethods来自测量师宝石。
  2. 因为我在这里使用了super,所以它会调用可以正常工作create的方法, SurveyorControllerMethods但我不明白。

并且 gem 安装在

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

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

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

1 回答 1

2

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

在 boot.rb 你会发现:

require 'bunder/setup'

在 application.rb 的顶部,您会发现:

Bundler.require(:default, :development)

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

然后,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 行并且只在需要的时候需要 gems,它不会随着时间的推移变得如此缓慢。

于 2012-05-03T16:30:38.777 回答