Как вы проверяете, загружена ли библиотека/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 он попытается включить "Win32/Console/ANSI", чтобы включить цветовые коды ANSI как \e [36m. То, что я пытаюсь сделать, - это если система является окном, а "Win32/Console/ANSI" не загружена, она добавит цветовые коды, поэтому цветовые коды не выводятся. Вот файл.
Ответы
Ответ 1
Большинство библиотек обычно определяют константу верхнего уровня. Обычно нужно проверить, определена ли эта константа.
> defined?(CSV)
#=> nil
> require "csv"
#=> true
> defined?(CSV)
#=> "constant"
> puts "loaded!" if defined?(CSV)
loaded!
#=> nil
Ответ 2
require
будет вызывать LoadError, если он не может найти библиотеку, которую вы пытаетесь загрузить. Таким образом, вы можете проверить это как
begin
require 'some-library'
puts 'This will run.'
rescue LoadError
puts 'This will not run'
# error handling code here
end
Ответ 3
Требовать библиотеку, если она уже загружена
Для простоты здесь загрузите библиотеку, если она уже не загружена:
require 'RMagick' unless defined?(Magick)
Ответ 4
Если вы хотите безопасно попросить использовать gem/library, которые могут быть недоступны, используйте что-то вроде этого:
begin
require 'securerandom'
rescue LoadError
# We just won't get securerandom
end
Это работает, даже если требуемый камень не требуется. В этом случае оператор require
ничего не сделает, и блок rescue
никогда не будет выполняться.
Если вас просто интересует, был ли загружен gem/library, проверьте, присутствует ли одна из его констант. Я делаю что-то подобное, чтобы динамически загружать дополнительные функции, если загружена ActiveSupport:
if defined?(ActiveSupport)
require "active_support/cache/redis_store"
end
Вы также можете использовать противоположное для загрузки уровня совместимости, если gem/library НЕ присутствует. Например, я использую несколько методов Hash
, которые не существуют в реализации Ruby Core Hash, но добавляются ActiveSupport. Таким образом, я определяю эти методы, когда мой камень работает в среде, где ActiveSupport не существует.
require 'core_ext/hash' unless defined?(ActiveSupport)
Ответ 5
попробуйте следующее:
def loaded?(name)
r = Regexp.new("#{name}.rb$")
$LOADED_FEATURES.select{|t| t.match(r) }.any?
end
Обязательно укажите название своего модуля (поиск здесь $LOADED_FEATURES
).