2011-06-10 31 views
1

我们的Rails应用程序从多个来源提取源。拉动这些提要的工作人员需要rmagick,oracle数据库和许多其他宝石的gem依赖关系。简而言之,它们与主要的Web应用程序有着非常不同的依赖性需求。直到Rails 3和Bundler,生活都很好。如何在单个Rails项目中处理Bundler中不同的gem依赖关系?

这些工人gem依赖与我们的实际生产网站无关。在Rails 3下,一个Gemfile预计将包含所有这些依赖关系。这具有要求在生产应用程序中加载所有gem依赖关系的恶劣副作用,这会导致无意义的膨胀,可能的安全问题,内存泄漏,复杂的部署以及其他问题。可悲的是,Bundler打破了标准的需求机制,通过允许我们只需要在工作人员中需要必要的宝石,并将它们放在系统的某个位置,而不是捆绑在一起,就可以摆脱困境。工作人员使用我们的导轨模型来存档他们的数据。

任何人都可以提出解决方案,使系统在Rails 3中实用吗?我试图让Gemfile在各处使用条件环境变量来驱动gem命令,但是,似乎Gemfile.lock可能会使这个问题从一个工作者脚本(对于提要)工作到另一个工作者脚本,不同的依赖关系。帮帮我???

回答

3

我一直在考虑类似的问题,尽管我还没有在任何地方使用的解决方案,但您的问题确实让我想到了更多。我认为你应该能够use a group to accomplish this。您可以添加这样的事情你的Gemfile:

group :workers do 
    gem "extra_gem_1" 
    gem "extra_gem_2" 
end 

然后,您可以拨打

Bundler.require(:default, :workers) 

,并应载入你的宝石。这是如何工作的取决于你的设置,你可能会添加逻辑config/application.rb,或者你可能需要在别处做这个。这可能是件怪事,但它仍然可以在控制台中使用。

当安装你的宝石,你可以拨打:

bundle install --without workers 

从生产排除那些宝石。

另外,你可以使用两个Gemfiles,但这看起来像一个混乱,因为大概有一些交叉。

相关问题