Ruby on rails Rails引擎中的Gem依赖

Ruby on rails Rails引擎中的Gem依赖,ruby-on-rails,ruby,gem,rails-engines,Ruby On Rails,Ruby,Gem,Rails Engines,我遵循了Rails中的文档,并在engines目录中设置了api引擎。根据第1段,应该在引擎/my_api/my_api.gemspec文件中定义gem依赖项,这与我所做的差不多: s.add_dependency "responders", "2.0" 添加后 `gem 'my_api', path: "engines/my_api"` 对于应用程序Gemfile和正在运行的bundler,一切看起来都与预期的一样: bundle install | grep responders I

我遵循了Rails中的文档,并在
engines
目录中设置了
api
引擎。根据第1段,应该在
引擎/my_api/my_api.gemspec
文件中定义gem依赖项,这与我所做的差不多:

s.add_dependency "responders", "2.0"
添加后

`gem 'my_api', path: "engines/my_api"`
对于应用程序
Gemfile
和正在运行的bundler,一切看起来都与预期的一样:

 bundle install | grep responders
 Installing responders 2.0.0
在下一步中,我使用相应的控制器等设置根路径,然后转到
引擎/my_api/app/controllers/my_api/application_controller.rb
,并添加以下内容:

module MyApi
  class ApplicationController < ActionController::Base
    respond_to :json
  end
end

正如您所观察到的,无论gem是否在应用程序的gem文件中,它都包含在包中。区别在于,当在应用程序初始化期间调用
Bundler.require
时,它只自动要求应用程序的gem文件中的gem,而不是间接依赖项


如果您的gem要求加载响应程序gem,那么它应该明确要求加载响应程序gem,例如在my_api的顶部。rb

引擎使用名称空间将引擎代码与主应用程序隔离。你可能也想尝试在你的主应用程序中添加响应者宝石。这就是我所做的,但它不是违背了引擎的目的吗?如果我的引擎依赖20颗宝石呢?这将是一场噩梦。谢谢你的解释,它是有意义的,它的工作!
$ gem list | grep rails
coffee-rails (4.1.0)
jquery-rails (4.0.3)
rails (4.2.1)
rails-deprecated_sanitizer (1.0.3)
rails-dom-testing (1.0.6)
rails-html-sanitizer (1.0.2)
sass-rails (5.0.3)
sprockets-rails (2.2.4)