我目前正在研究一个分为四个部分的 Rails 3 项目:
- 面向公众的网站
- 管理网站/后端
- 模型
- 第三方数据访问 API
由于模型在三个关键组件之间共享,我想让它们远离一个主要项目,但是每个部分都需要访问模型,但我不想重复代码并且到处都有不同的版本。
目前我在 gem 中有模型代码,在每个项目的 Gemfile 中,我使用以下行引用它们:
gem "my_models", :path => "../my_models/"
但是,当我部署到我们的测试服务器以供我的同事评估系统时,我需要从外部存储库中提取模型,因此我将上述行替换为以下内容:
gem "my_models", :git => "git@private.repository.com:username/my_models.git"
这本身运作良好,但在“版本”方面非常笨拙(即,每次我希望将更改部署到测试服务器时,我都需要修改版本),切换线路以使用 git 而不是本地,并确保我正确推送文件。
以前我使用共享的 git 子模块,但这同样尴尬。
我宁愿不将所有东西都构建到一个大型项目中,因为这些往往会变得异常庞大且难以维护,而且我还想尽可能分离关注点,因此我对管理站点所做的任何更改都没有太大的意义影响其他组件的机会 - 显然模型有可能导致问题,但这是我考虑并理解的风险。
当涉及到这样的事情时,人们会提出什么建议?或者,我是不是完全走错了路?
一些额外的背景:
这个应用程序是对现有网站的重写,它遵循“将所有内容集中到一个项目中”的模型 - 不幸的是,这里有两个问题:
- 该应用程序开发得很糟糕 - 我继承了这个项目,当我第一次拿起它时,单个用户每页的加载时间约为 2 分钟 - 这已经减少了,但始终存在问题
- 我们目前处于当前站点的容量限制,我们预计未来 6 个月我们将需要承担更多负载 - 但是使用“一体式”应用程序进行横向扩展意味着我们将浪费资源进行横向扩展不需要它的站点的后端。
基本上有两件事我想分开 - 前端(作为公共网站和 API)和后端 - 我所知道的关于软件开发的一切都告诉我,将所有这些结合在一起并不是一个理想的解决方案(过去的历史表明我认为将这两者分开是确保前端性能的好举措)。
也许我需要从另一个角度看待这个问题——将模型保留在每个项目中,而不是在项目之间共享它们,而是为每个功能区域提供一个缩减的功能子集(即后端需要知道谁创建了一个帖子,但是前端并不真正关心这一点,因此在读取模型时省略该逻辑)。