两个Rails应用程序之间的共享模型 - Workflow的理想解决方案是什么?

Mat*_*age 53 ruby-on-rails backend rails-models

我目前正在开发一个Rails 3项目,该项目分为四个部分:

  • 面向公众的网站
  • 管理网站/后端
  • 模特
  • 用于第三方数据访问的API

由于模型在三个关键组件之间共享,我希望它们远离一个主项目,但是每个部分都需要访问模型,但我不想重复代码并且在任何地方都有不同的版本.

目前我在gem中有模型代码,在每个项目的Gemfile中我使用以下行引用它们:

gem "my_models", :path => "../my_models/"
Run Code Online (Sandbox Code Playgroud)

但是,当我部署到我们的测试服务器以供我的同事评估系统时,我需要从外部存储库中提取模型,因此我将以上行替换为以下内容:

gem "my_models", :git => "git@private.repository.com:username/my_models.git"
Run Code Online (Sandbox Code Playgroud)

这在它自身运行良好,但它在"版本"方面非常笨重(即我每次希望将更改部署到测试服务器时都需要碰撞版本),切换线路以使用git而不是本地,并确保我正确地推送文件.

以前我使用的是共享的git子模块,但这很尴尬.

我宁愿不把所有内容都构建成一个大型项目,因为这些项目往往变得怪异且难以维护,如果可能的话我也想分开关注点,因此我对管理站点所做的任何更改都没有太多有可能影响其他组件 - 显然这些模型有可能引发问题,但这是我已经考虑和理解的风险.

当涉及到这样的事情时,那里的人们会提出什么建议呢?或者,我是否完全采用了错误的方式?

一些额外的背景:

这个应用程序是对现有网站的重写,遵循"将所有内容整合到一个项目中"的模式 - 不幸的是,这里有两个问题:

  1. 该应用程序开发得很糟糕 - 我继承了这个项目,当我第一次拿起它时,每个页面的加载时间约为2分钟,只有一个用户 - 这已经减少但仍然存在问题
  2. 我们目前处于当前站点的容量限制,我们预计在未来6个月内我们将需要承担更多负载 - 然而使用"一体化"应用程序进行扩展意味着我们将在扩展时浪费资源网站的后端不需要它.

基本上我要分开两件事 - 前端(公共网站和API)和后端 - 我对软件开发的所有了解都告诉我,将所有这些结合在一起并不是一个理想的解决方案(过去的历史表明我认为,在确保前端性能方面,将这两者分开是一个很好的举措.

也许我需要从另一个角度来看这个 - 保持每个项目中的模型,而不是在项目之间共享它们,每个功能区域都有一个简化的功能子集(即后端需要知道谁创建了一个帖子,但是前端并不真正关心它,因此在阅读模型时省略了这种逻辑).

key*_*one 20

删除模型项目(将模型放入其他部分之一,我建议您考虑"更重要"),将所有项目放入单个存储库(单独的项目文件夹)并对模型/库/ apis /无论如何设置符号链接

您的代码高度耦合在一起,您经常需要同时更改几个项目(如更新模型更新使用它们的API等)

单一repo-symlink设置的一个好处是你的提交将更少碎片,通常代表完整的功能实现 - 更容易跟踪错误,读取历史记录和维护代码库

同样在部署时,您不需要从许多存储库中读取 - 在那里只需少一点故障

发布过程也比这样的模型更简单,因为分支现在将包含所有项目的范围

有一些缺点,如符号链接在窗户上不能很好地工作,但对我来说,它的工作完美


Har*_*tty 8

您可以创建一个包含共享模型的可安装引擎,并从中创建一个gem.这将优雅地处理名称间距问题.这里另一个不错的方面是你也可以分享你的资产.

观看此railscast了解更多详情.


iaf*_*nov 1

我知道这不能解决您的特定问题。但我真的建议你将所有项目合并为一个。将所有这些部分包含在一个应用程序中是很常见的,并且没有任何开销。我认为这个问题没有不尴尬的解决方案。

  • 我不同意。将所有内容合并为一个整体将导致一个整体应用程序,只要应用程序的任何单个部分发生变化,无论其相关性如何,都需要进行更新。例如,您必须关闭 API 才能在网站上部署 CSS 更改。 (15认同)