Rails:可配置的可扩展模块化应用程序

时间:2013-10-22 22:45:35

标签: ruby-on-rails deployment configuration module

我想使用Rails构建一个可扩展的模块化应用程序,可以配置它以满足一个人的要求。

让我解释一下我在“可扩展”和“模块化”下的理解。例如,假设我正在开发一个博客应用程序引擎,我有一个名为BlogEntry的模型,它包含一个简单的博客条目通常包含的内容 - 标题和内容。我们假设我希望这个应用程序能够以2种模式运行:

  • 简单BlogEntry只有2个属性 - 标题和内容
  • 在增强模式下 - 例如,当BlogEntry扩展为具有更多属性时,它会与名为Tag的单独模型进行多对多关联。

我的目标是:

  • 让最终用户使用一些简单的机制以基本形式或扩展功能形式部署应用程序,例如安装附加软件包,启用/禁用配置开关,取消注释配置文件中的行等等。当然,可能会有很多超过2个“模式” - 这些添加大多是独立的,其中几个可以同时启用。
  • 明确分离代码库 - 一个只实现基本功能的代码库,另一个代码实现其他可插入的东西(例如现有模型或新模型的附加属性);这些更改不仅应该在模型中传播,还应该反映在控制器,视图,gem要求,测试,路由规则,支持扩展功能模型所需的数据库迁移等中。
  • 将一些面向对象的原则用于模型,控制器和视图:例如,基本模型BlogEntry只是一个简单的独立类,当插入标记功能包括BlogEntry中的某种增强模块时class,向BlogEntryController添加一些代码,甚至在blogentry视图中的某些指定位置添加一些输出。

因此,如果一个人不想要任何复杂的功能,那么应用程序就会非常简单和基本。如果一个人想要额外的东西,应用程序可以扩展几个插件,因此它不会最终成为一个巨大的应用程序,即所有的一切英国媒体报道。

事实上,这种可插拔功能几乎存在于任何主要的高级Web开发平台中,例如MediaWiki,Moodle,WordPress等。

到目前为止,搜索“模块化轨道”已经产生了:

  • Rails引擎 - 基本上,如果我理解正确的话,它是一种将大型应用程序分成几个较小的,准独立的应用程序并在它们之间建立链接的方法 - 这不是我想要的。这也允许在几个不同的应用程序中重用一些常见的Rails代码,这也是我想要的。
  • Rails插件 - 基本上是一种机制,可以轻松地将外部库以宝石的形式包含到项目中(带有额外的铃声和口哨声,例如插件提供的生成器) - 但它是开发人员的解决方案,需要与插件进行广泛集成。这通常不适合最终用户管理员必须决定是否需要此功能的方案 - 没有简单的配置过程来启用或禁用它。
  • Application templates - 基本上,包含在生成器中的现成应用程序能够快速生成类似的应用程序。这可能对代码重用很有用,但与可配置的模块化概念无关。

我敢打赌,有数以万种方法可以实现我所说的。什么是最好的?我在哪里可以看到这种模块化应用的一个很好的例子?

1 个答案:

答案 0 :(得分:1)

我认为Rails Engines确实是你想要的。

我已经为几个作为引擎提供的应用程序做出了贡献,基本上可以完成您所描述的内容。这是其中一个主要由我开发的:http://github.com/team-umlaut/umlaut

它并不总是完全直截了当,有很多地方你需要决定如何设置,而Rails文档或明显的约定并不是必须指导你的。我同意(非常有限的)引擎文档并不一定会引导您走这条路。但是发动机足以完成需要做的事情。还要给你足够的绳索来悬挂自己并使事情过于复杂。

我建议使用rails plugin new name_of_engine --full创建引擎骨架 - 但 --mountable。我认为--mountable过度复杂,没有对这种特殊类型的引擎用例有益。 (其他人可能不同意;是的,关于选择和最佳实践的事情,并不总是清楚这种情况)。

Rails插件基本上已弃用;目前唯一支持的插件是plugins-as-gems - 其中Engine是最强大的(可以与Rails进行大多数交互),你会想要这种东西。

我同意你为什么app模板在这里不够用 - 尽管你可能想提供一个app模板,用你的gemfile中的引擎创建一个应用程序,以及在本地应用程序中生成的任何必要的本地存根。我在umlaut的最新版本中做到了这一点,但直到最近才开始,它并不是绝对必要的,我会在你至少得到一个基本的概念证明之后离开它。

Rails并不一定会鼓励这一点,但它有可能并且有足够的工作量,并且我同意你的观点是适合某些事情的。