10

我使用 Rails 已经有一段时间了,并且一直在我的 gemfile 中使用 gem,但我从来没有真正理解我安装的 gem 的功能是如何真正可用的。假设我使用 has_permalinks gem ( http://haspermalink.org/ )。它.generate_permalink!为我的模型提供了一种方法。这个方法在哪里定义?为什么我只是通过安装gem就可以突然使用这种方法?是否有某种include//来初始化 gem 的代码requireload以便应用程序的其余部分可以访问它?另外,当我安装 gem 时,这段代码存储在哪里?

4

1 回答 1

15

我分别回答了你的问题,而且不按顺序回答,但我认为它实际上可能更容易理解这个顺序的答案。

另外,当我安装 gem 时,这段代码存储在哪里?

如果您使用的是 Bundler,您可以这样做bundle show has_permalink,它会显示该 gem 的安装位置。pg这是我用gem做的一个例子:

✗ bundle show pg
/Users/jasonswett/.rvm/gems/ruby-1.9.2-p320@jason/gems/pg-0.11.0

这个方法在哪里定义?

如果你这样做bundle show,它会返回一个路径——该方法是在其中的某个地方定义的。(如果需要,您可以使用它grep -r 'def generate_permalink' /gem/path来找到确切的位置。)

为什么我只是通过安装gem就可以突然使用这种方法?是否有某种包含/要求/加载来初始化 gem 的代码,以便应用程序的其余部分可以访问它?

查看有关 Rails 初始化过程的这部分文档:http: //guides.rubyonrails.org/initialization.html#config-boot-rb

在一个标准的 Rails 应用程序中,有一个 Gemfile 声明了应用程序的所有依赖项。config/boot.rb 将 ENV["BUNDLE_GEMFILE"] 设置为该文件的位置,然后需要 Bundler 并调用 Bundler.setup 将应用程序的依赖项(包括所有 Rails 部分)添加到加载路径,使其可用于要加载的应用程序。

看起来,在这个过程的早期,Rails 会查看您的 Gemfile 并通过 Bundler 加载您的所有 gem。所以有你的包括。

于 2013-04-10T18:30:58.197 回答