如何将大型 Rails 应用程序分割成可以协同工作的较小应用程序?
-
23-08-2019 - |
题
我使用过 Django 一些,我非常喜欢它的项目/应用程序模型:您可以通过组装一个或多个 Django 应用程序来构建 Django 项目。这些应用程序可以是自治的,或者某些应用程序可以构建在其他应用程序之上。一个应用程序可以轻松地依赖另一个应用程序的模型,以及它的控制器(Django 家伙称它们为“视图”),甚至它的视图(Django 中的“模板”)。
我现在正在从事一个相对较大规模的 Ruby on Rails 项目,我很惊讶地发现在 Rails 中显然没有简单的方法可以做同样的事情。基本上,在 Rails 中,一个项目 = 一个应用程序。我们的项目一开始是一个巨大的单体应用程序,现在我们正在尝试找出如何将其分割成更小的块。
例如,我们当前的应用程序允许我们管理合作伙伴和合同(除其他外)。我想要一个“合作伙伴”应用程序来管理我们的合作伙伴(地址、联系人等)和一个“合同”应用程序来管理我们与合作伙伴的合同。“合同”应用程序将依赖于“合作伙伴”应用程序(但为了避免循环依赖,我希望“合作伙伴”应用程序不了解“合同”应用程序)。
目前,我认为主要选项如下:
- 使这些应用程序通过 REST 请求进行通信(每个应用程序将充当 Web 服务):这很好,但它似乎禁止重用其他应用程序的视图。例如,如果“合作伙伴”应用程序有一个很好的页面来显示合作伙伴的详细信息,并且如果我想在合同详细信息页面的中间显示该页面(稍加修改),我看不到其他方法这比让“合同”应用程序通过 REST 请求向“合作伙伴”应用程序询问合作伙伴详细信息(它将获得对象表示,而不是视图),然后从“合同”应用程序复制/粘贴合作伙伴详细信息页面的源代码。合作伙伴”应用程序到“合同”应用程序。
- 将这些应用程序变成插件:不太好,而且有点困难,但似乎允许模型和视图重用
- 使用 svn external 在应用程序之间共享一些模型:简单但丑陋。
感谢您的建议。
解决方案
由于这是我也希望能够做到的事情,我可以提供四个 - 不完整且相对未经测试(由我)的“解决方案”:
排名不分先后...
使用导轨 引擎 插件,显然现在可以在 2.2 上使用。这在某种程度上或全部可能会被纳入 Rails 2.3(见下文)
切换到默布, 哪 有一种叫做“切片”的东西, 可能会提供您正在寻找的内容。无论如何,如果这 是正确的(我有什么好怀疑的 耶胡达·卡茨?一切都是一样的 反正总有一天,这很酷。
看看 引擎功能 在 Edge Rails 中(“Edge”是最新提交但未发布的版本,因此它通常可以工作,但可能还没有达到 100% 的生产质量)。
考虑使用 routes.rb 中的命名空间 - 分配一个项目
app
到命名空间意味着您可以将其放入相关的子目录中app
子目录,尽管这可能不太干净,因为每个“应用程序”都有一组单独的 Rails 目录。
其中,我没有 (2) 的经验,因为我(在基础设施方面)与 Rails 紧密相连,但没关系,我喜欢 Rails。我打算看看(1),也许(3),因为 2.3 可能会在我需要部署下一个主要版本之前发布,并且我已经尝试过(4),它可以工作,但是,嗯,繁琐并且(对我来说)有点令人困惑。
其他提示
如果你想研究 Mike 的第二个选项,Merb 切片有 有关该主题的有用截屏视频.
我使用了 Desert 插件(以前称为“plugins plus”)。看起来效果很好。http://github.com/pivotal/desert/tree/master
我对 RoR 的看法是将你的“应用程序”编写为 Rails 中的控制器。他们可以非常独立,但可以分享帮助者和观点。我不了解 Django,所以也许术语不同。