运行Rails应用程序的自定义版本

ken*_*enn 9 ruby-on-rails ruby-on-rails-3

这是我们的基本要求:

  • 我们有一个基础Rails应用程序,正在积极维护.
  • 我们希望提供此应用程序的自定义版本,因为:
    • 服务器必须驻留在我们客户的前提下,并在不同的域上运行.
    • 有一个特定的日志记录工具,用于在数据中心内进行监控.

为此,我可以看到实现该目标的几个选项:

  • Git分支
  • Rails::Engine
  • Rails::Application

最明显的答案是Git分支,具有完全的灵活性.

但是我不确定这是不是一个好主意,因为代码库基本上是共享的,主线有更多的活动 - 赶上rebase/merge可能只是额外的麻烦.

我们希望尽可能地将原始版本和自定义版本分离.换句话说,我们希望在原始和定制之间尽可能减少冲突.

Rails::Engine或者Rails::Application似乎是一个很接近的想法(我不熟悉Rails引擎),但我不明白如何拥有OurApp::ApplicationOurCustomizedApp::Application在一个地方,并在全球和动态之间切换它们.

有可能会很高兴:

  • 自定义初始化程序,控制器和视图在一个单独的目录中覆盖(或修补)原始
  • 能够指定由环境变量引导的应用程序(原始应用程序或自定义应用程序) RAILS_APP
  • 单独的配置文件,如下所示:config/database.ymlconfig/customer1/database.yml
  • 使用相同的能力,deploy.rb对Capistrano的(可能与config/servers.ymlconfig/customer1/servers.yml定义角色和IP?)

是否有针对我们要求的做法/惯例?有什么建议?

我们的应用程序运行在Ruby 1.9.2 + Rails 3.0.3上.

UPDATE

我们把它作为Git分支开始.我们创建了一个rake任务来生成一个文件,config/branch其中包括"master"或"custom"等文本,application.rb在bootstrap时读取它.配置喜欢database.ymlservers.yml现在住在config/mainline/config/customized/,application.rb相应地处理它们.

config.paths.config.database = "config/#{branch}/database.yml"
Run Code Online (Sandbox Code Playgroud)

不完美,但现在还不错.当我们找到更好的方法时,我会更新.

eli*_*rar 1

我知道这不是您想要的精确答案,但我相信 Git 将是自定义应用程序和添加逻辑来处理其他配置文件的最少量的工作 - 而且是最容易长期管理的,修改部署文件并管理(可能)新的 css/js/模板文件。

使用变基和合并将大大减少出错的可能性,并且只要您定期保持分支同步,就不应该有任何严重的问题来保持它们都是最新的。毕竟,这就是 Git 所擅长的!;)