检查宝石是否可以从其他宝石内部获得

时间:2012-10-01 20:59:16

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

我正在为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

非常感谢任何帮助。

2 个答案:

答案 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"