Подтвердить что ты не робот

Как вы проверяете, загружена ли библиотека/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" не загружена, она добавит цветовые коды, поэтому цветовые коды не выводятся. Вот файл.

4b9b3361

Ответ 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).