1

私は現在、ルビー用のGemを書いています。私が提供したいもののいくつかは、resqueまたはsidekiqのサポートです。一般に、サービス(どちらか一方)が利用できない場合にユーザーをクラッシュさせたくないので、ユーザーがそれらのgemを起動して実行している場合にのみ、ユーザーをロードしたいと思います。

私は次のことを試しました:

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

どんな助けでも大歓迎です。

4

2 に答える 2

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 に答える
1

あなたの中に、.gemspecあなたの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 に答える