在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”,它将附加颜色代码,因此不输出颜色代码。 Here is the file.
答案 0 :(得分:24)
大多数库通常会定义顶级常量。通常要做的是检查是否定义了常量。
> defined?(CSV)
#=> nil
> require "csv"
#=> true
> defined?(CSV)
#=> "constant"
> puts "loaded!" if defined?(CSV)
loaded!
#=> nil
答案 1 :(得分:10)
require
找不到您要加载的库,则会抛出LoadError。所以你可以像这样检查
begin
require 'some-library'
puts 'This will run.'
rescue LoadError
puts 'This will not run'
# error handling code here
end
答案 2 :(得分:6)
为简单起见,以下是加载库的方法,除非它已经加载:
require 'RMagick' unless defined?(Magick)
答案 3 :(得分:5)
如果您想安全地尝试要求可能有或没有可用的宝石/库,请使用以下内容:
begin
require 'securerandom'
rescue LoadError
# We just won't get securerandom
end
即使有问题的宝石已经已经,这也有效。在那种情况下,require
语句将不执行任何操作,rescue
块将永远不会执行。
如果您只对已加载的gem /库感兴趣,请检查其中是否存在其中一个常量。如果加载了ActiveSupport,我会这样做以动态加载其他功能:
if defined?(ActiveSupport)
require "active_support/cache/redis_store"
end
如果gem / library不存在,您也可以使用相反的方法加载兼容层。例如,我使用了Ruby核心Hash实现中不存在的一些Hash
方法,但是由ActiveSupport添加。因此,当我的gem在不存在ActiveSupport的环境中运行时,我定义了这些方法。
require 'core_ext/hash' unless defined?(ActiveSupport)
答案 4 :(得分:1)
试试这个:
def loaded?(name)
r = Regexp.new("#{name}.rb$")
$LOADED_FEATURES.select{|t| t.match(r) }.any?
end
确保模块的名称(在此处$LOADED_FEATURES
搜索)。