ruby-on-rails-3 - 导轨 3.2 : Gem dependencies only for Sidekiq worker

标签 ruby-on-rails-3 bundler sidekiq

我有一个 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/

相关文章:

ruby - Bundler 在直接调用 .rb 文件时工作,在通过其他 ruby​​ 脚本的 exec 调用时失败

ruby-on-rails - perform_later和perform_async有什么区别?

ruby-on-rails - 结合 ruby​​ 选择特定语言时如何使用 JavaScript 选择的功能?

ruby-on-rails-3 - Ruby on Rails,回形针 : "identify" command working in cmd but not in app

ruby-on-rails-3 - 从一个 worker 调用多个 sidekiq worker

ruby - 执行位于 bundle 的 gem 中的 Thor 任务

ruby-on-rails-3 - 使用 Rails 迁移创建表时如何添加 created_at 和 updated_at

ruby-on-rails - 为什么人们把像 `gem "守卫 "` in their ` :development` group in Gemfiles 这样的东西

ruby-on-rails - 在 Rails 中运行 Redmon 和 Sidekiq?

redis - Sidekiq 连接。什么是与 Redis 的连接?