2015-04-22 123 views
3

我在Rails文档中遵循Getting Started with Engines,并且我在engines目录中设置了api引擎。根据段落6.6 Other Gem Dependencies一个应该定义engines/my_api/my_api.gemspec文件的gem依赖,这是相当多我所做的:Rails引擎中的Gem依赖关系

s.add_dependency "responders", "2.0" 

加入

`gem 'my_api', path: "engines/my_api"` 

的应用Gemfile和运行打捆,一切之后看起来如预期:

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服务器,去根URL和你猜怎么着?我收到以下消息:

控制器级别的respond_to功能已提取给响应者gem。将它添加到您的Gemfile中以继续使用此功能:gem'responders','〜> 2.0'有关详细信息,请参阅Rails升级指南。

正如错误消息中所建议的,我已将gem添加到应用程序Gemfile,运行bundle install,并且所有内容均按预期工作。

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

编辑:

忘了提版本:

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

引擎使用命名空间的引擎代码从主应用程序隔离例如。您可能想尝试将响应者宝石添加到您的主应用程序中。 – joelparkerhenderson

+0

这就是我所做的,但是它不会击败引擎的目的吗?什么,如果我的引擎不取决于20颗宝石?这将是一个噩梦来处理。 –

回答

1

当你观察,创业板已包含在你的包无论是在应用程序的Gemfile中与否。区别在于,在应用程序初始化过程中调用Bundler.require时,它只会自动在您的应用程序的Gemfile中需要gem,而不是间接依赖项。

如果你的宝石,需要被调用,那么它应该要求其明确的反应宝石宝石 - 在my_api.rb顶部

+0

感谢您的解释,它是有道理的,它的工作原理! –