需要在应用程序中需要gem,即使gemspec将其添加为运行时依赖项?

时间:2014-07-19 15:44:17

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

我有一个宝石说'A'用在gem中,gemspec文件添加了运行时依赖项

s.add_dependency'A','〜> 1.0'

我收到一条错误,说我运行应用程序时在gem中找不到某个文件/类。当我在应用程序Gemfile中包含gem时,这个错误消失了。

为什么我需要在应用程序中包含gem,尽管它是运行时依赖项?

1 个答案:

答案 0 :(得分:3)

这就是gem依赖项的工作原理。当你添加一个依赖项时,它不会自动要求依赖于gem(实际上它不能,因为没有办法知道要求的文件名 - 并非所有的gems都与它们的主文件同名)。

向gem添加依赖项有两个效果。首先,当您安装gem时,也会自动安装依赖于gem的宝石。

其次,当gem 激活时(通常在你require文件时发生,但可以用gem明确地完成)宝石的lib目录是添加到加载路径,任何依赖项的lib目录也是如此。这可以确保当主gem在这些依赖项上调用require时,将使用正确的版本。

主要宝石仍然需要在其依赖项上调用require。一般来说,Rubygems无法知道应该要求哪个文件来自gem,或者何时(或者甚至是)它应该发生。例如,在某些情况下可能只需要依赖项,因此您希望避免调用require(这会降低您的速度),除非您确实需要提供的功能。