Как проверить, была ли загружена библиотека / ruby-gem? - PullRequest
25 голосов
/ 08 декабря 2011

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

Ответы [ 5 ]

26 голосов
/ 08 декабря 2011

Большинство библиотек обычно определяют константу верхнего уровня. Обычно нужно проверить, определена ли эта константа.

> defined?(CSV)
#=> nil

> require "csv"
#=> true

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

> puts "loaded!" if defined?(CSV)
loaded!
#=> nil
11 голосов
/ 08 декабря 2011

require сгенерирует LoadError, если не сможет найти библиотеку, которую вы пытаетесь загрузить.Таким образом, вы можете проверить это так

begin
  require 'some-library'
  puts 'This will run.'
rescue LoadError
  puts 'This will not run'
  # error handling code here
end
6 голосов
/ 11 мая 2014

Требовать библиотеку, если она уже не загружена

Для простоты, вот как вы загружаете библиотеку, если она еще не загружена:

require 'RMagick' unless defined?(Magick)
5 голосов
/ 08 декабря 2011

Если вы хотите безопасно попробовать запросить драгоценный камень / библиотеку, которая может или не может быть доступна, используйте что-то вроде этого:

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

Это работает, даже если у рассматриваемого камня уже есть требуется.В этом сценарии оператор require ничего не будет делать, а блок rescue никогда не будет выполняться.

Если вас просто интересует, был ли загружен гем / библиотека, проверьте, не один лиего констант присутствует.Я делаю что-то вроде этого для динамической загрузки дополнительных функций, если загружен ActiveSupport:

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

Вы также можете использовать противоположное для загрузки слоя совместимости, если гем / библиотека НЕ ​​присутствует.Например, я использую некоторые Hash методы, которых нет в базовой реализации Hash в Ruby, но которые добавлены ActiveSupport.Итак, я определяю эти методы, когда мой гем работает в среде, где ActiveSupport не существует.

require 'core_ext/hash' unless defined?(ActiveSupport)
1 голос
/ 23 ноября 2017

попробуйте это:

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

Убедитесь в названии вашего модуля (поиск здесь $LOADED_FEATURES).

...