3

我想使用 Rails 构建一个可扩展的模块化应用程序,该应用程序可以配置为符合自己的要求。

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

  • 简单化BlogEntry只有两个属性 - 标题和内容
  • 在增强模式下 - whenBlogEntry扩展为具有更多属性,例如,它将与名为Tag.

我的目标是:

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

因此,如果一个人不想要任何复杂的功能,应用程序仍然非常简单和基本。如果需要额外功能,可以使用多个插件扩展应用程序,因此它最终不会成为一个庞大的单一应用程序,即万事万物的臃肿软件。

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

到目前为止,搜索“模块化导轨”得到了:

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

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

4

1 回答 1

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 进行最多类型的交互),你会想要这种类型的东西。

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

Rails 并不一定鼓励这样做,但这是可能的,并且需要足够的工作才能解决,我同意你的观点适用于某些事情。

于 2014-10-07T06:21:04.607 回答