我正在为ruby编写Gem,因为我想提供的一些东西是对resque或sidekiq的支持。一般来说,如果服务(任何一个)不可用,我不希望用户崩溃,因此我只想在用户启动并运行这些gems时加载它们。
我尝试了以下内容:
mymod.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文件的顶部添加“require'sidekiq'”,但这样做会妨碍人们使用这两种服务。
有没有办法查看用户是否安装了gem,然后允许他们使用该服务?
我正在使用: - Ruby 1.9.3 - Rails 3 - Sidekiq 1.2.1
非常感谢任何帮助。
答案 0 :(得分: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
答案 1 :(得分:1)
在.gemspec
内确保添加宝石所依赖的所需gem作为运行时依赖项。这样Bundler将是安装gem时处理gem的可用性的方法。所有你不必担心的是使用gem(即require
然后使用它)。
在您的情况下,这看起来像
# in name_of_gem.gemspec
# some code identifying your gem
s.add_runtime_dependency "rails"
s.add_runtime_dependency "sidekiq"