【问题标题】:Gem dependencies in Rails EnginesRails 引擎中的 Gem 依赖项
【发布时间】:2015-04-22 17:50:34
【问题描述】:

我遵循了 Rails 文档中的Getting Started with Engines,并在engines 目录中设置了api 引擎。根据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 和正在运行的捆绑程序,一切看起来都符合预期:

 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 应用程序。从一个自包含的应用程序中,我至少希望能够正确解决它的依赖关系。我假设我只是做错了什么,我希望有人能够帮助我解决这个问题,为什么我必须在应用程序中明确指定 gem 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)

【问题讨论】:

  • 引擎使用命名空间将引擎代码与主应用程序隔离开来。您可能还想尝试将响应者 gem 添加到您的主应用程序中。
  • 这就是我所做的,但这不是违背引擎的目的吗?什么,如果我的引擎不依赖 20 颗宝石?这将是一场噩梦。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的解释,这很有意义并且有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多