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



我有一个gem说' a '在gem中使用,并且gemspec文件添加了一个运行时依赖项说

。add_dependency 'A', '~> 1.0'

当我运行我的应用程序时,我得到一个错误说一些文件/类在gem中没有找到。当我在应用程序的Gemfile中包含gem时,这个错误就会消失。

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

这就是gem依赖项的工作方式。当你添加一个依赖时,它不会自动要求被依赖的gem(事实上它不能,因为没有办法知道需要的文件名——不是所有的gem都和它们的主文件同名)。

在gem中添加依赖项有两个效果。首先,当你安装gem时,依赖的gem也会自动安装。

第二,当gem 被激活时(这通常发生在你从它中require一个文件时,但可以通过gem显式地完成),gem的lib目录被添加到加载路径中,任何依赖的lib目录也被添加到加载路径中。这可以确保当主gem在这些依赖项上调用require时,将使用正确的版本。

主gem仍然需要调用require对它的依赖。一般来说,Rubygems没有办法知道gem中的哪个文件应该被需要,或者什么时候(甚至如果)应该被需要。例如,依赖项可能只在某些情况下才需要,所以除非您确实需要所提供的功能,否则您希望避免调用require(这会减慢您的速度)。

最新更新