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

denglitong · 2018年04月08日 · 最后由 denglitong 回复于 2018年04月08日 · 428 次阅读

现有一需求需要对一个复杂的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下也会有很多目录。

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

共收到 2 条回复

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

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

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

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

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

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

好的,谢谢!

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