22

我有一个客户想要将他们在一个利基市场取得成功的 Rails 应用程序应用到另一个类似的利基市场。这个应用程序的新实例一开始将非常相似:所有相同的功能、不同的徽标和颜色。但是,如果新站点成功,它将不可避免地需要不应该应用于原始站点的重大自定义。同时,如果修复了错误并对一个应用程序进行了改进,那么两个应用程序应该能够共享这些改进。

任何人都可以提出解决此问题的策略或资源吗?如何使适用于这两个应用程序的更改不会花费更长的时间来测试和实施?

是的,我知道答案涉及 SCM、插件、gem 和 Rails 引擎。这些工具将会并且正在被使用。但我想知道何时以及如何使用这些工具来解决这个问题。

也欢迎链接。


这个问题与以下问题不同:

多个网站在同一个代码库上运行? 在我的问题中,我没有运行具有不同设置的完全相同的应用程序。

您如何在多个代码库之间同步更改?我在问一个类似的问题,但我特别问的是 Rails 应用程序。

4

4 回答 4

32

我们目前使用的设置与您所描述的非常相似。

我们开始为客户开发一个有点大的 Rails 应用程序(销售、库存管理、产品目录等)。完成后,出现了几个几乎相同功能的新请求。

然而,原始应用程序必须继续维护,添加新功能,纠正错误等等。

扩展的需要保持大部分功能,但会改变外观和外观。

我们所做的是遵循一系列步骤:

  1. 首先,我们开始清理代码,将硬代码引用拉到表中,减少和优化查询,查找丢失的索引以及改进 ActiveRecord 使用的方法
  2. 在有些满意之后,我们开始开发缺失的测试。我不能过分强调它为什么有用,因为我们将为多个应用程序维护相同的代码库,并且需要尽可能保护核心功能免受新更改的影响。
  3. 这也是一个神奇的词:核心功能。我们开始选择可以重用的基本功能,并提取所有通用代码。这为我们提供了控制器、模型和视图的组合,我们开始将其更改为模块、插件和 gem。什么去哪里?很大程度上取决于您的代码。根据经验,不涉及领域语言的功能会使用插件(如果不太依赖 Rails,则使用 gems)
    1. 这种方法将我们引向了几个插件、gem,然后我们将它们组合在一起重新组装原始项目,然后它进入了它自己的 GIT 存储库。这样,我们就有了一个主“模板”存储库,它为每个组件粘合了所有组件和其他几个 GIT 存储库。
    2. 最后,我们开发了一个简单的主题系统(基本上加载 /stylesheets/themes/:theme_name/ 并从数据库中获取主题名称)。由于它是一个 Intranet 项目,我们几乎可以通过适当的 CSS 样式来做任何事情。我猜想与 IE 一起工作你需要一种更复杂的方法。
    3. 然后,我们只是使用该主存储库在其之上开发新功能。

现在,我们如何处理核心基础的变化。我们从模板存储库开始。我们修复或定义应该修复或更改的位置,然后在此处或相应的 gem/plugin 上进行更改。正确测试后,我们将其部署到我们的 GitHub 帐户。

最后,我们从该模板存储库中合并/变基其他项目,获取新的更新。

听起来有点复杂,但这只是为了设置。当前的工作流程非常简单易行,具有与多个开发人员合作而不会出现更大问题的给定优势。

于 2009-11-21T03:26:23.950 回答
3

只需对主站点进行最少的改动,就可以在扩展模板和更改样式的同时使用其中的 Ruby 代码。我在 Django 中进行了广泛的研究,布局可能如下所示:

project/
    sites/
        site_one/
            templates/
            models.py
            settings.py
            urls.py
            views.py
        site_two/
            templates/
            models.py
            settings.py
            urls.py
            views.py
    base_app/
    settings.py

你可以尝试在 Rails 中做类似的事情:

main_webapp/
    app/
    config/
    ...
    sites/
        site_one/
            controllers/
            models/
            views/
        site_two/
            controllers/
            models/
            views/

假设跨站点的功能是相同的,但它们只是具有不同的布局和样式,则将没有或很少有模型和控制器代码。如果您希望为特定站点添加更多功能,只需将代码粘贴到所需站点文件夹下即可。

Django 还具有站点的概念以及在特定项目文件夹和应用程序文件夹中查找模板的能力。您可以尝试复制这些功能并将它们带到 Rails 中,以实现从一个代码库运行多个站点。

我知道您正在寻找 Rails 解决方案,但您仍然可以检查它是如何在 Django 中完成的,并将一些有用的功能复制到另一端。如果我喜欢 Rails 的特定功能,我会将其移植到 Django/Python 上。

于 2009-12-01T16:38:56.140 回答
1

我们公司也在做类似的事情。除了目前涉及多个环境(生产、测试​​、开发)。我们使用 SVN 作为我们的 SCM 来保持我们的代码直截了当,并允许我们复制当前稳定的环境并创建应用程序的单独版本(并可能更改徽标或某些功能等内容)。我强烈推荐使用 Apache/Nginx 和Phusion 的 Passenger运行环境. 这让我们可以在相同/相似的代码库上单独运行所有这些应用程序。就是这样。我们必须使用数据库,一个生产和一个开发来保持我们的实时数据分开,但是您可以通过这种方式轻松地将两个应用程序实例连接到同一个数据库。到目前为止,它对我们来说非常好,因为它能够在不关闭主要生产服务器的情况下开发、测试和部署多个 Web 应用程序。

于 2009-11-20T18:40:51.643 回答
0

我知道这可以使用Git 子模块

于 2018-03-09T21:14:27.443 回答