我们的Rails应用程序从多个来源提取Feed。拉动这些提要的工作者需要rmagick,oracle数据库和许多其他gem的gem依赖关系。简而言之,它们具有与主Web应用程序非常不同的依赖性需求。直到Rails 3和Bundler,生活还是不错的。
这些工作者宝石依赖项与我们的实际生产网站无关。在Rails 3下,一个Gemfile应该包含所有这些依赖项。这具有令人讨厌的副作用,即要求在生产应用程序中加载所有gem依赖项,这将导致无意义的膨胀,可能的安全问题,内存泄漏,复杂的部署和其他弊端。令人遗憾的是,Bundler打破了标准的需求机制,它可以通过允许我们只在工作者中简单地需要必要的宝石并将它们放在系统的某个地方而不是捆绑中来提供摆脱泥潭的方法。工人们使用我们的轨道模型来存档他们的数据。
任何人都可以提出解决方案,使系统在Rails 3中实用吗?我很想让Gemfile在某些地方使用条件环境变量来驱动gem命令,但是,似乎Gemfile.lock可能会使这个问题从一个工作脚本(对于feed)工作到下一个,这会有不同的依赖关系。帮助???
答案 0 :(得分: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
,或者您可能需要在其他地方执行此操作。这可能是hackish,但它无论如何都适用于控制台。
安装宝石时,您可以致电:
bundle install --without workers
从生产中排除这些宝石。
或者,您可以使用两个Gemfiles,但这似乎也是一团糟,因为可能会有一些交叉。