web-dev-qa-db-ja.com

ライブラリ/ Ruby-gemがロードされているかどうかをどのように確認しますか?

Rubyコードで、ロードされている外部ライブラリを確認するにはどうすればよいですか?たとえば、

require 'some-library'
if is-loaded?('some-library')
  puts "this will run"
end

または

# require 'some-library' Don't load it in here
if is-loaded?('some-library')
  puts "this will not run"
end

これを行う方法はありますか?

これが必要な理由についての注意:私は boom で作業しており、Windowsでは、\ e [36mのようなANSIカラーコードを有効にするために 'Win32/Console/ANSI'を含めようとします。私がやろうとしているのは、システムがWindowsで、「Win32/Console/ANSI」がロードされていない場合、カラーコードが追加されるため、カラーコードは出力されません。 ここにファイルがあります。

27
Neil

ほとんどのライブラリは通常、最上位の定数を定義します。通常は、その定数が定義されているかどうかを確認します。

> defined?(CSV)
#=> nil

> require "csv"
#=> true

> defined?(CSV)
#=> "constant"

> puts "loaded!" if defined?(CSV)
loaded!
#=> nil
27
yfeldblum

requireは、ロードしようとしているライブラリが見つからない場合、LoadErrorをスローします。だからあなたはそれをこのようにチェックすることができます

begin
  require 'some-library'
  puts 'This will run.'
rescue LoadError
  puts 'This will not run'
  # error handling code here
end
11
declan

すでにロードされていない限り、ライブラリが必要

簡単にするために、ライブラリがすでにロードされていない限り、ライブラリをロードする方法は次のとおりです。

require 'RMagick' unless defined?(Magick)
6
Joshua Pinter

利用できる場合とできない場合があるgem /ライブラリを安全に要求したい場合は、次のようなものを使用してください。

begin
  require 'securerandom'
rescue LoadError
  # We just won't get securerandom
end

これは、問題のgemがすでに必要な場合でも機能します。そのシナリオでは、requireステートメントは何も実行せず、rescueブロックは実行されません。

Gem/libraryがすでにロードされているかどうかだけに関心がある場合は、その定数の1つが存在するかどうかを確認してください。 ActiveSupportがロードされている場合、追加機能を動的にロードするために、次のようなことを行います。

if defined?(ActiveSupport)
  require "active_support/cache/redis_store"
end

Gem/libraryが存在しない場合は、反対の方法を使用して互換性レイヤーをロードすることもできます。たとえば、Rubyのコアハッシュ実装には存在しないが、ActiveSupportによって追加されたいくつかのHashメソッドを使用します。そのため、ActiveSupportが存在しない環境でgemを実行するときに、これらのメソッドを定義します。

require 'core_ext/hash' unless defined?(ActiveSupport)
5
Carl Zulauf

これを試して :

def loaded?(name)
  r = Regexp.new("#{name}.rb$")
  $LOADED_FEATURES.select{|t| t.match(r) }.any?
end

モジュールの名前を確認してください(ここで検索$LOADED_FEATURES)。

1
barbacan