我使用 Rails 已经有一段时间了,并且一直在我的 gemfile 中使用 gem,但我从来没有真正理解我安装的 gem 的功能是如何真正可用的。假设我使用 has_permalinks gem ( http://haspermalink.org/ )。它.generate_permalink!
为我的模型提供了一种方法。这个方法在哪里定义?为什么我只是通过安装gem就可以突然使用这种方法?是否有某种include
//来初始化 gem 的代码require
,load
以便应用程序的其余部分可以访问它?另外,当我安装 gem 时,这段代码存储在哪里?
1 回答
我分别回答了你的问题,而且不按顺序回答,但我认为它实际上可能更容易理解这个顺序的答案。
另外,当我安装 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。所以有你的包括。