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」がロードされていない場合、カラーコードが追加されるため、カラーコードは出力されません。 ここにファイルがあります。
ほとんどのライブラリは通常、最上位の定数を定義します。通常は、その定数が定義されているかどうかを確認します。
> defined?(CSV)
#=> nil
> require "csv"
#=> true
> defined?(CSV)
#=> "constant"
> puts "loaded!" if defined?(CSV)
loaded!
#=> nil
require
は、ロードしようとしているライブラリが見つからない場合、LoadErrorをスローします。だからあなたはそれをこのようにチェックすることができます
begin
require 'some-library'
puts 'This will run.'
rescue LoadError
puts 'This will not run'
# error handling code here
end
簡単にするために、ライブラリがすでにロードされていない限り、ライブラリをロードする方法は次のとおりです。
require 'RMagick' unless defined?(Magick)
利用できる場合とできない場合がある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)
これを試して :
def loaded?(name)
r = Regexp.new("#{name}.rb$")
$LOADED_FEATURES.select{|t| t.match(r) }.any?
end
モジュールの名前を確認してください(ここで検索$LOADED_FEATURES
)。