如何将大型Rails应用程序切割成可以协同工作的小型应用程序?

时间:2008-12-24 08:44:54

标签: ruby-on-rails deployment refactoring code-reuse

我和Django有点合作,我非常喜欢它的项目/应用程序模型:你可以通过组装一个或多个Django应用程序来构建一个Django项目。这些应用程序可以是自治的,或者某些应用程序可以构建在其他应用程序之上。应用程序可以轻松地依赖于另一个应用程序的模型,以及它的控制器(Django dudes称之为“视图”)甚至它的视图(Django中的“模板”)。

我现在正在开发一个相对大规模的Ruby on Rails项目,我很惊讶地发现在Rails中显然没有简单的方法可以做同样的事情。基本上,在Rails中,一个项目=一个应用程序。我们的项目已经开始作为一个巨大的单片应用程序,我们现在正试图弄清楚如何将它分成更小的块。

例如,我们当前的应用程序允许我们管理合作伙伴和合同(以及其他内容)。我希望有一个“合作伙伴”应用程序来管理我们的合作伙伴(地址,联系人等)和“合同”应用程序,它将管理我们与合作伙伴的合同。 “合同”应用程序将依赖于“合作伙伴”应用程序(但为了避免循环依赖,我希望“合作伙伴”应用程序不了解“合同”应用程序)。

目前,我认为以下是主要选项:

  1. 使这些应用程序通过REST请求进行通信(每个应用程序将充当Web服务):这很好,但它似乎禁止重用其他应用程序的视图。例如,如果“合作伙伴”应用程序有一个很好的页面来显示合作伙伴的详细信息,并且如果我想显示该页面,稍微修改一下,在合同详细信息页面的中间,我看不到其他方法可以做这是让“合同”应用程序通过REST请求向“合作伙伴”应用程序询问合作伙伴详细信息(它将获得对象表示,而不是视图),然后复制/粘贴合作伙伴详细信息页面的源代码来自“合作伙伴“应用于”合同“应用。
  2. 将这些应用程序转换为插件:不是很好,而且有点困难,但似乎允许模型&视图重用
  3. 使用svn external从应用程序到应用程序共享一些模型:简单但难看。
  4. 感谢您的建议。

4 个答案:

答案 0 :(得分:5)

由于这是我也想做的事情,我可以提供四个 - 不完整且相对未经测试(由我)“解决方案”:

没有特别的顺序......

  1. 使用Rails engines插件,它现在显然适用于2.2。在某种程度上,这可能会进入Rails 2.3(见下文)

  2. 切换到 Merb,哪个 有一种叫做“切片”的东西 可能会提供你想要的东西。 无论如何,如果 this 是对的(我应该怀疑谁 Yehuda Katz?)它们都是一样的 无论如何,有一天,这很酷。

  3. 看看Edge Rails中的engines functionality(“Edge”是最新提交但尚未发布的版本,因此通常可以使用,但可能不是100%的生产质量)。

  4. 查看使用namespaces in routes.rb - 将app中的项目分配给命名空间意味着您可以将其放入相关app子目录中的子目录中,尽管这可能更少清理为每个“应用程序”都有一组单独的Rails目录。

  5. 其中,我没有(2)的经验,因为我(在基础设施方面)与Rails绑定,但是没关系,我喜欢Rails。我打算看一下(1)和也许(3),因为2.3可能会在我需要部署我的下一个主要版本之前发布,而我已经尝试过(4),它有效,但很好,很好一点点(对我而言)令人困惑。

答案 1 :(得分:2)

如果你想调查迈克的#2选项,那么Merb切片就是a screencast on the topic that is helpful

答案 2 :(得分:2)

我使用过沙漠插件(以前称为“插件加”)。它似乎工作得很好。 http://github.com/pivotal/desert/tree/master

答案 3 :(得分:-2)

我认为RoR的方式是将你的“应用程序”编写为Rails中的控制器。他们可以相当独立但可以分享帮助者和观点。我不知道Django所以也许术语不同。