1

我目前正在为 ruby​​ 编写 Gem,并且我想提供的一些东西是对 resque 或 sidekiq 的支持。通常,如果服务(其中一个)不可用,我不希望用户崩溃,所以我只想在用户启动并运行这些 gem 时加载它们。

我尝试了以下方法:

我的mod.rb

module Mymod
  # Code code code
end

require "mymod/railtie" if defined?(Rails)
require "mymod/sidekiqworker" if defined?(Sidekiq)

mymod/sidekiqworker.rb

module mymod
  class Sidekiqworker
    include Sidekiq::Worker
    sidekiq_options :queue => :default

    def perform(path)

    end
  end
end

但是当我加载 gem 并启动服务器时,类不包括在内(看起来 sidekiq 没有定义)。

如果我在 sidekiqworker 文件的顶部添加“需要'sidekiq'”,这将有效,但这会破坏允许人们使用任一服务的目的。

有没有办法查看用户是否安装了 gem,然后允许他们使用该服务?

我正在使用: - Ruby 1.9.3 - Rails 3 - Sidekiq 1.2.1

任何帮助将不胜感激。

4

2 回答 2

1

在你的内部.gemspec确保你添加了你的gem所依赖的所需gem作为运行时依赖项。这样一来,当您的 gem 安装时,Bundler 将成为处理该 gem 可用性的工具。您只需要担心使用gem(即require,然后使用它)。

在你的情况下,这看起来像

# in name_of_gem.gemspec

# some code identifying your gem

s.add_runtime_dependency "rails"
s.add_runtime_dependency "sidekiq"
于 2012-10-02T06:04:24.157 回答
1

您通常会捕获LoadError.

begin
  require 'sidekiq'
rescue LoadError
  # sidekiq not available
end

您可以将结果分配给变量

has_sidekiq = begin
  require 'sidekiq'
  true
rescue LoadError
  false
end

require "mymod/sidekiqworker" if has_sidekiq
于 2012-10-01T21:05:15.403 回答