【问题标题】:Rails 3.2: Gem dependencies only for Sidekiq workerRails 3.2:仅适用于 Sidekiq 工作人员的 Gem 依赖项
【发布时间】:2023-03-20 06:40:02
【问题描述】:

我有一个包含大量代码和依赖项的 Rails 应用程序。它有一个 Web 服务器组件、一个工作组件(基于 Sidekiq)和一个数据库组件。

我有一些必须在工人中的宝石,但我不需要它们在网络服务器中。我也不希望我的控制器或视图代码加载到 Sidekiq 工作程序中。

有没有办法告诉 Bundler(我猜是通过 Gemfile)只在 worker 中包含某些 gem 或类,而不是在 web 服务器中?

【问题讨论】:

    标签: ruby-on-rails-3 bundler sidekiq


    【解决方案1】:

    最干净的解决方案是在您的 Gemfile 中创建一个工作组:

    group :worker do
      # These gems are only needed by the workers
      gem 'foo'
      gem 'bar'
    end
    

    默认情况下不会加载这些 gem。

    然后在初始化您的工作人员时调用Bundler.require(:worker)

    编辑(回应您的评论):

    这里有两个完全可以接受的选项,

    a) 不要在您的工作人员中加载 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 以便在此处进行区分)。

    【讨论】:

    • 我喜欢这个答案,但是....Bundler 已经带来了我的宝石(我想)。这是在哪里完成的,以便我可以将其注释掉并调用 Bundler.require(:worker) ?另外,我是否必须在每个工人中进行此调用,还是有一些常见的地方可以这样做?
    • 啊,我没有仔细阅读您的问题,抱歉。我会做一些修改...
    【解决方案2】:

    如果你把这个添加到你的 Gemfile:

    gem 'mygem', require: false
    

    然后,您可以根据环境有条件地在您的初始化程序中要求 mygem。

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 2013-09-04
      • 2013-07-10
      • 2018-11-05
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多