在Rails应用之间共享代码/配置/约定/宝石

时间:2017-03-01 18:14:19

标签: ruby-on-rails git rubygems dry rails-engines

问题

首先介绍一下上下文:我目前是一名自由职业者,使用Ruby on Rails开发webapps。因为我独自工作,所以优化我的工作流程非常重要。

这就是为什么自从我开始使用Rails以来我一直有同样的问题:
如何在我的应用之间共享代码/配置/约定/测试?

更确切地说,我想分享:

  • 我一直使用的常见宝石及其配置
  • 常见的集成测试,以确保一些约定
  • 常见视图助手,测试助手,核心类扩展,javascript / sass partials
  • 常用文件:.gitignore,git hooks,.eslintrc,我的CI配置文件等

我在所有应用中需要的一些具体示例:

  • 默认情况下禁用turbolinks,如果需要,则稍后添加
  • 使用javascript代替coffeescript
  • 使用slim而不是ERB
  • 安装/配置capistrano
  • 安装CSS框架(bootstrap,bourbon + neat + refills)

到目前为止,我还没有真正需要共享模型和控制器。 我不想分享系统本身的行为或功能组件,我不是在寻找微服务架构。

我发现到目前为止,在创建新应用程序时,所有这些设置工作确实花了我很多时间。此外,当我添加新内容时,我希望将其主动应用于现有应用程序。

我做了很多研究,但我还没有找到很多答案。许多人都在尝试分享模型,但很少有人愿意在所有应用之间分享共同点。但是,找到合适的关键字可能就是问题所在。

在我看来,Rails在应用程序中非常擅长DRY,在尝试在应用程序之间进行DRY时并不那么容易。

可能的解决方案

1 - Rails应用程序模板

我正在使用的解决方案,在Rails Application Templates guide中描述,使用与Creating and Customizing Rails Generators & Templates guide中描述的Rails生成器相同的API。

这是Thoughtbot使用的解决方案,其流行的suspenders gem。虽然对于Butbot来说,他们有多年的经验,有很多员工,他们的共同设置并没有那么大的变化。

优点:

  • 在创建新应用程序时节省了大量时间
  • 非常好的API

缺点:

  • 大量重复:所有应用程序都有相同的公共代码,此代码的问题变得不同步
  • 不追溯:无法为已创建的应用添加常用功能
  • 繁重的维护工作:我目前的工作流程是每个月浏览一次我的应用程序的git日志,对于我拥有的所有应用程序可能通用的每个提交,将其添加到应用程序模板,并将其添加到手动的其他应用程序

到目前为止,这个解决方案并没有那么糟糕,因为我只有两个应用程序。但是一旦我有更多,我将遭受越来越多的开销。

更好的解决方案可能是为每个常见新功能创建生成器/ rake任务,以便能够将其快速应用到现有应用程序,并直接在新应用程序的应用程序模板中调用它。
我虽然没有尝试过,但我不确定它会起作用。例如,如果我想在所有应用程序中的现有公共文件中传播单行更改,该怎么办?

2 - Rails引擎

我在Rails Engines上做了一些修改以分享代码 我没有从Getting Started with Engines guide了解我是否应该更好地使用--full引擎或 - 可安装引擎来实现此特定目的。

优点:

  • 一旦我更新了gem版本,所有更改都可供应用程序使用
  • 干:所有常见代码都在一个独特的地方(宝石)

缺点:

  • 我要分享的宝石放在* .gemspec文件中,该文件没有Gemfile那么多的功能(据我所知)
  • 由于需要更新所有应用程序中的gem版本,迁移到帮助程序的新API等所导致的开销
  • 无法共享非rails文件(.gitignore,git hooks,.eslintrc)

这个解决方案有太多重要的缺点。

3 - 混合解决方案:Rails应用程序模板+ Rails引擎

也许最好的方法是使用上述解决方案 在gem共享帮助器和测试中,在rails模板中共享gems,它们的配置/文件和其他文件(用于git,linters等)
它确实增加了更多的复杂性和开销......

4 - 使用git子树

有些人使用git子树在多个webapps之间共享文件夹。

缺点:

  • 一个人必须共享整个文件夹,不容易在rails app中的不同目标目录中共享我需要的一切
  • 似乎有点" hacky"给我

结论

是否有另一种解决方案,而不是我上面提到的解决方案? 您认为最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

如何让空白" Master"某个地方的git中的rails app。使用您想要分享的所有设置和配置。从头开始创建新应用程序时,您可以合并" Master"进入它以应用默认值。当你有一个现有的应用程序,同样的事情,只需根据需要合并和解决冲突。这也使你能够在需要时覆盖合并的代码。

我认为这种方法很少见:

  • Rails应用程序名称可能会引起很多麻烦

  • 任何更新都可能导致合并冲突

答案 1 :(得分:0)

我在nodejs项目中工作时创建了一个用于处理此问题的工具。但是该工具实际上只是命令行工具,因此您应该可以使用它。

https://github.com/tomasbjerre/dictator-builder

这是创建独裁者的概念,该独裁者决定了代码库的各个部分。