0

我有一个更高级别的应用程序,其中包括两个引擎:

  • 核心(引擎)
  • API(引擎)

API 引擎取决于 Core 引擎中存在的模型。我想知道如何引用这些。


我试过的

例如,如果核心引擎有模型“用户”,我如何通过 API 引擎引用它?

module Api
describe User do
routes { Api::Engine.routes }

before :each do
  ::Core::User.create!
end
....

使用此代码,我收到:

 Failure/Error: ::Core::User.create!
 NameError:
   uninitialized constant Core

所以我认为我必须在 api.gemspec 文件中包含核心引擎。

  s.add_dependency "core", path: "core/"

但是,看起来捆绑器不喜欢那样。

There was a Gem::Requirement::BadRequirementError while loading
api.gemspec:
Illformed requirement [{:path=>"core/"}] from myAppPath/api/api.gemspec:21:in

我也试过

s.add_dependency "core", path: "../core/"

但这给了我一个类似的错误。

知道应该怎么做才能从引擎中引用Core模型吗?API

谢谢!

更新 我试图通过 Api 的 Gemfile 将 Core 引擎添加到 Api 引擎中。不幸的是,我得到一个错误。我开始觉得引擎不应该引用其他引擎。那会是真的吗?

/home/.rvm/gems/ruby-2.0.0-p247/gems/railties-
4.0.0/lib/rails/application/routes_reloader.rb:10:in `rescue in execute_if_updated': 
Rails::Application::RoutesReloader#execute_if_updated delegated to 
updater.execute_if_updated, but updater is nil: #
<Rails::Application::RoutesReloader:0x007fb53b67bce8 @paths=
["/home/myApp/api/spec/dummy/config/routes.rb", "/home/myApp/core/config/routes.rb", 
"/home/myApp/api/config/routes.rb"], @route_sets=[#
<ActionDispatch::Routing::RouteSet:0x007fb53b3b8420>, #
<ActionDispatch::Routing::RouteSet:0x007fb53b6008b8>, #
<ActionDispatch::Routing::RouteSet:0x007fb53b6b9b60>]> (RuntimeError)

更新发现 除了下面的答案,我想补充一点,.gemspec 文件没有关于 gem 存储位置的任何信息,即它不会指向 git 存储库或文件路径等。这个在这篇文章中有解释:

http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

4

1 回答 1

1

这里有两点需要理解:

如果您的引擎应该是公开的(例如 Devise 引擎),那么您需要Coregemspec. 您将无法使用它来引用它path。但是对于公共引擎来说,这不是问题,因为公共引擎将在某个时间点出现在 Rubygems 上。

如果您的引擎是私有的并且仅用于清理您的代码库,那么添加gem 'core', path: '../core'到引擎的 Gemfile 就可以了。

这里要记住的事情:

  • gemspec用于依赖项声明(您的引擎需要的宝石才能工作)
  • Gemfile用于本地或测试依赖项声明
于 2013-08-18T09:33:06.203 回答