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

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

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

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

也欢迎链接。


这个问题不一样:

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

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

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

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

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

扩展的function需要保持大多数function,但需要改变外观和外观。

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

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

现在,我们如何处理核心基础的变化。 我们从模板库开始。 我们修复或定义修复或更改应该在哪里,并在那里或在相应的gem /插件上更改它。 在对其进行适当测试后,我们将其部署到我们的GitHub帐户。

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

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

只需最少的主网站触摸,就可以在扩展模板和更改样式的同时使用它的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/ 

假设各个站点的function相同但它们只有不同的布局和样式,那么将没有或只有很少的模型和控制器代码。 如果您希望向特定站点添加更多function,只需将代码粘贴在所需的站点文件夹下即可。

Django还具有Sites的概念,并能够在一个特定的项目文件夹和app文件夹中查找模板。 您可以尝试复制这些function并将其转移到Rails,以实现从一个代码库运行多个站点。

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

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

我知道使用Git子模块可以实现这一点