Rails引擎中的Gem依赖项

时间:2015-04-22 17:50:35

标签: ruby-on-rails ruby gem rails-engines

我已按照Rails文档中的Getting Started with Engines进行操作,并在api目录中设置了engines引擎。根据段落6.6 Other Gem Dependencies,我们应该在engines/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

在下一步中,我设置了一个带有相应控制器等的根路径,然后转到engines/my_api/app/controllers/my_api/application_controller.rb并添加以下内容:

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

我启动rails服务器,去根网址猜猜是什么?我得到以下信息:

控制器级“respond_to”功能已被提取到响应者gem。将其添加到您的Gemfile以继续使用此功能:gem'responseders','〜&gt; 2.0'有关详细信息,请参阅Rails升级指南。

正如错误消息中所建议的,我已将gem添加到应用程序Gemfile,运行bundle install,一切都按预期工作。

据我所知,引擎应该是自包含的rails应用程序。从一个自包含的应用程序,我至少期望正确解决其依赖关系。我认为我只是做错了,我希望有人能够帮助我解决问题,为什么我必须在应用程序Gemfile中明确指定gem?

修改

忘了提及版本:

$ 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)

1 个答案:

答案 0 :(得分:2)

正如您所看到的,无论是否在您的应用程序的Gemfile中,gem都包含在您的包中。不同之处在于,在应用程序初始化期间调用user.signUpInBackgroundWithBlock时,它只需要自动在您的应用程序的Gemfile中使用gem,而不是间接依赖。

如果你的gem需要加载响应者gem gem,那么它应该明确地要求它 - 例如在my_api.rb的顶部