Rails 如何将已有 Rails 改造成 engine 挂载到宿主应用?

denglitong · 2018年04月08日 · 最后由 JoyceJoyce 回复于 2022年03月04日 · 1507 次阅读

现有一需求需要对一个复杂的 rails 进行插件化开发,有两个思路:

  1. 老大的意思是在原有 rails 的目录结构下增加一个 plugins 目录,然后在里面写插件的逻辑;
  2. 我倾向于达到的做法是:将已有的 rails 改造成一个 full engine,然后挂载到宿主应用中,宿主应用直接重载 full engine 中的内容扩展功能即可;

第一个思路,目前实现的 demo 比较简单,插件中可能还未涉及独立的 db:migrate、worker/jobs 这类的应用,只是一个简单的 mvc,当然如果选择了这个思路最后肯定也是会走通的。

第二个思路,由于我目前对 rails 的 engine 这里还不是很熟悉,只是对 rails 的启动过程有过简单了解,对往下的 rack/railties 都了解不是很多,而且我们这个已有的复杂 rails 应用确实很复杂(如果说可以和 gitlab-ce 相媲美也不为过),所以我考虑的风险点是一个复杂的 rails 应用改造成一个 full engine(暂时就不考虑 mountable engine 吧)挂载到一个新的宿主应用中是否现实?如果要达到这个目标,我需要去学习哪些知识看哪些资料?这个需求排期还有一个月多一点的时间。

目前我查阅到的 engine 的资料大多是介绍 mountable engine 的,不过鉴于我的需求只是不再改动原有的 rails 应用而是对其进行扩展,所以我这里想改造成 full engine 挂载。而对 mountable engine 的入门案例里都算简单,不涉及 engine 变庞大之后像诸如 gem 包加载、目录层级变得很多的情况,比如 lib/下有各种 api 接口,config 下有很多配置和初始化脚本,app 下也会有很多目录。

所以,上面两个思路哪个更符合最佳实践?我倾向于实现第二个思路,但鉴于目前能力所限,对接下来的具体实现还不是很清晰,希望各位大牛指导一下我正确的方向,如果能有参考资料或者相关案例就更好了。

你老大既然提这个思路,那他应该有具体的实现方案,指导你来实现。

或者你这些想法可以整理整理好,和他讨论看看是否可行。

其实用 Engine 来搞弊端挺多的:

  • 难于测试,因为 Engine 里面有可能需要项目的功能(如果你要用来拆分业务的话);
  • 联调困难,需要多个项目一起协调;
  • Migration 分散不利于统一管理;

如果没有特别的必要原因,最好不要那么做。

我一直认为 Engine 只适合于一些特有的公共基础功能,而不是业务。

好的,谢谢!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号