2016-02-26 59 views
0

我正在开发一个ruby/rails应用程序,该应用程序通过添加插件应该具有高度的可扩展性。一个插件显然是一个gem,它遵循特定的轮廓并包含库代码,一个带有资产,路线,控制器,视图等等的轨道引擎。此外,还有一些API允许插件开发人员注册自定义条目以抽象应用程序的概念,例如添加cronjobs(在主系统中是某种cron),向CLI添加命令等等。Bundler:允许用户在UserGemfile中添加宝石

在应用程序附带的Gemfile中会包含一些“内置”插件,因为它们是应用程序的一部分并始终激活。并且会有一些社区书面的宝石可选。

现在我正在寻找一种可能性,让用户在他的机器上安装应用程序,附加宝石(包含插件)到应用程序。

最简单的(但不是最好的)解决方案就是说“只需在运行bundle install之前将所需的插件宝石添加到Gemfile中”)。但是,如果出现应用程序更新,Gemfile可能会发生冲突,并且可能会被重置或用户必须解决这些冲突。这是我不想要的东西。

一个更好的方法是说“嘿,这是一个UserGemfile,只需将该文件的插件宝石添加到该文件并运行bundle install”。 UserGemfile将在.gitignore列出,一切都会很好。

不幸的是,好像bundler不支持类似的东西。

你有什么建议如何解决这个问题?

回答

1

你可以做这样的事情,在比如import_gems:

puts `cat Gemfile UserGemfile > EffectiveGemfile` 
puts `bundle install --gemfile=EffectiveGemfile` 

然后,当你运行你的应用程序,指定的Gemfile:

BUNDLE_GEMFILE=EffectiveGemfile bundle list 

确保添加EffectiveGemfile和EffectiveGemfile .lock to .gitignore也是如此。

+0

谢谢。我会很快尝试。 – phortx

+0

我将所有内容从'Gemfile'移动到'dependencies.rb',为插件创建了一个YAML文件,并且每次都改变'bin/bundler'来重新生成基于'dependencies.rb'和YAML文件的'Gemfile'在实际运行之前。我还在'.gitignore'中添加了'Gemfile'。到目前为止效果很好。剩余的问题:Gemfile.lock呢?实际上你应该提交这个文件,但是使用我在这里使用的自定义gem机制,它的内容将取决于用户/开发人员的本地设置。 – phortx