从相同的rails代码库运行多个站点?

时间:2009-11-20 18:30:40

标签: ruby-on-rails codebase

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

有人可以建议解决此问题的策略或资源吗?如何保持适用于这两个应用的更改花费更长的时间来测试和实施?

是的,我知道答案涉及SCM,插件,宝石和Rails引擎。这些工具将被使用。但是我想知道何时如何使用这些工具来解决这个问题。

也欢迎链接。


这个问题与以下不一样:

Multiple websites running on same codebase? 在我的问题中,我没有使用不同的设置运行完全相同的应用程序。

How do you sync changes between multiple codebases?我问了一个类似的问题,但我特别询问Rails应用程序。

4 个答案:

答案 0 :(得分:29)

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

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

然而,原始应用程序必须继续维护,添加新功能,纠正错误和诸如此类的东西。

扩展的功能需要维护大多数功能,但需要改变外观和外观。

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

  1. 首先,我们开始清理代码,提取对表的硬编码引用,减少和优化查询,查找缺失的索引以及改进ActiveRecord使用的方法
  2. 在满意后,我们开始开发缺失的测试。我不能强调为什么它有用,因为我们将为几个应用程序维护相同的代码库,并且需要核心功能受到保护,因为它可以来自新的更改。
  3. 这也是一个神奇的词:核心功能。我们开始选择可以重用的基本功能,并提供所有通用代码。这给了我们混合的控制器,模型和视图,我们开始将其转换为模块,插件和宝石。 怎么回事?很大程度上取决于您的代码。根据经验,不涉及域语言的功能适用于插件(如果它不太依赖于Rails,则为宝石)
    1. 这种方法引导我们使用了几个插件,然后我们将它们组合在一起重新组装原始项目,然后它就到了它自己的GIT存储库。这样,我们就有了一个主要的“模板”存储库,它将所有组件和其他几个GIT存储库粘合在一起。
    2. 最后,我们开发了一个简单的主题系统(基本上是加载/ stylesheets / themes /:theme_name /并从数据库中获取theme_name)。由于它是一个内部网项目,我们几乎可以使用适当的CSS样式做任何事情。我想与IE合作你需要一个更复杂的方法。
    3. 然后,我们刚刚使用该主存储库开发新功能。
  4. 现在,我们如何处理核心基础的变化。我们从模板库开始。我们修复或定义修复或更改应该在哪里,并在那里或在相应的gem /插件上更改它。在对其进行适当测试后,我们将其部署到我们的GitHub帐户。

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

    听起来有点复杂,但仅限于设置。当前的工作流程非常简单,具有与多个开发人员合作而没有更大问题的优势。

答案 1 :(得分:2)

在最少触及主站点的情况下,可以在扩展模板和更改样式的同时使用它的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还有Sitesability的概念,可以在一个特定的项目文件夹和一个app文件夹中查找模板。您可以尝试复制这些功能并将它们转移到Rails,以实现从一个代码库运行多个站点。

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

答案 2 :(得分:1)

我们在公司做类似的事情。除了目前涉及多个环境(生产,测试,开发)。我们使用SVN作为我们的SCM来保持我们的代码直接,让我们复制当前的稳定环境并创建应用程序的单独版本(并可能更改徽标或某些功能)。我强烈建议使用Apache / Nginx和Phusion's Passenger运行环境。这让我们在相同/相似的代码库上单独运行所有这些应用程序。就是这样。我们需要DB,一个Production和一个Development来保持我们的实时数据分离,但您可以通过这种方式轻松地将两个app实例连接到同一个db。到目前为止,它能够很好地开发,测试和部署多个Web应用程序,而无需关闭主要的生产服务器。

答案 3 :(得分:0)

我知道使用Git Submodules

可以实现这一点