我有一个 Rails 应用程序,它有很多代码和依赖项。它有一个 Web 服务器组件、一个工作组件(基于 Sidekiq)和一个数据库组件。
我有一些必须在工作人员中的 gem ,但我不需要在网络服务器中使用它们。我也不希望在 Sidekiq 工作器中加载我的 Controller 或 View 代码。
有什么方法可以告诉 Bundler(我假设是通过 Gemfile)只在 worker 中包含某些 gems 或类,而不是在 web 服务器中?
最佳答案
最干净的解决方案是在您的 Gemfile 中创建一个工作组:
group :worker do
# These gems are only needed by the workers
gem 'foo'
gem 'bar'
end
默认情况下不会加载这些 gem。
然后在初始化您的工作人员时调用
Bundler.require(:worker)
编辑(回应您的评论):
这里有两个完全可以接受的选择,
a) 不要在你的 worker 中加载 rails 环境。
我相信实现这一点的正确方法是使用
sidekiq -r worker_environment.rb
调用 sidekiq其中 worker_environment.rb 需要您的依赖项和您的工作文件。b) 配置您的 rails 环境,不要为您的工作进程加载默认的 gem 组。
我不确定 Rails 3.2,但在 Rails 4.x 中,您会在 config/application.rb
Bundler.require(*Rails.groups)
中找到一行. Rails.groups 通常类似于 [:default, :development]
或 [:default, :production]
.所以你可以添加一些逻辑来代替只需要 :worker
如果你在一个工作进程中(也许你可以只为你的工作进程设置一个 env var 以便在这里区分)。
关于ruby-on-rails-3 - 导轨 3.2 : Gem dependencies only for Sidekiq worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27629610/