我可以调用一个Ruby方法来获取已安装宝石的列表吗?
我想解析的输出gem list
。有其他方法可以做到这一点吗?
我可以调用一个Ruby方法来获取已安装宝石的列表吗?
我想解析的输出gem list
。有其他方法可以做到这一点吗?
Answers:
Gem命令现在随Ruby 1.9+一起提供,并且是Ruby 1.9之前版本的标准添加。
require 'rubygems'
name = /^/i
dep = Gem::Dependency.new(name, Gem::Requirement.default)
specs = Gem.source_index.search(dep)
puts specs[0..5].map{ |s| "#{s.name} #{s.version}" }
# >> Platform 0.4.0
# >> abstract 1.0.0
# >> actionmailer 3.0.5
# >> actionpack 3.0.5
# >> activemodel 3.0.5
# >> activerecord 3.0.5
这是获取列表的更新方法:
require 'rubygems'
def local_gems
Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name }
end
由于local_gems
依赖group_by
,它返回宝石的哈希值,其中键是宝石的名称,值是宝石规格的数组。该值是已安装的gem实例的数组,按版本号排序。
这样就可以执行以下操作:
my_local_gems = local_gems()
my_local_gems['actionmailer']
# => [Gem::Specification.new do |s|
# s.authors = ["David Heinemeier Hansson"]
# s.date = Time.utc(2013, 12, 3)
# s.dependencies = [Gem::Dependency.new("actionpack",
# Gem::Requirement.new(["= 4.0.2"]),
# :runtime),
# Gem::Dependency.new("mail",
# Gem::Requirement.new(["~> 2.5.4"]),
# :runtime)]
# s.description = "Email on Rails. Compose, deliver, receive, and test emails using the familiar controller/view pattern. First-class support for multipart email and attachments."
# s.email = "david@loudthinking.com"
# s.homepage = "http://www.rubyonrails.org"
# s.licenses = ["MIT"]
# s.name = "actionmailer"
# s.require_paths = ["lib"]
# s.required_ruby_version = Gem::Requirement.new([">= 1.9.3"])
# s.requirements = ["none"]
# s.rubygems_version = "2.0.14"
# s.specification_version = 4
# s.summary = "Email composition, delivery, and receiving framework (part of Rails)."
# s.version = Gem::Version.new("4.0.2")
# end]
和:
puts my_local_gems.map{ |name, specs|
[
name,
specs.map{ |spec| spec.version.to_s }.join(',')
].join(' ')
}
# >> actionmailer 4.0.2
...
# >> arel 4.0.1,5.0.0
...
# >> ZenTest 4.9.5
# >> zucker 13.1
最后一个示例与gem query --local
命令行类似,只有您可以访问特定gem规范的所有信息。
这列出了我已安装的所有宝石。
gem query --local
http://guides.rubygems.org/command-reference/#gem-list
请参阅2.7列出所有已安装的gem
gem list
。
gem list
完全满足了我的需要,并且在CLI上调用起来更加简单,容易。为什么这么多命令可以做一件事?
都
gem query --local
和
ruby -S gem list --local
列出69个条目
而
ruby -e 'puts Gem::Specification.all_names'
给我82
我曾经wc -l
得到数字。不确定这是否是正确的检查方法。尝试将输出重定向到文本文件并进行了区分,但这没有帮助-需要手动进行逐一比较。
ruby
命令在单独的行上列出每个gem版本。对于例如: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)
对 sass-3.3.14
, sass-3.3.7
, sass-3.3.6
, sass-3.2.19
很久以来就有一种方法可以使用:
ruby -e 'puts Gem::Specification.all_names'
Gem::Specification.map {|a| a.name}
但是,如果您的应用使用Bundler,它将仅返回依赖的本地gem的列表。要全部安装:
def all_installed_gems
Gem::Specification.all = nil
all = Gem::Specification.map{|a| a.name}
Gem::Specification.reset
all
end
NoMethodError: undefined method
什么吗?当我使用nil:NilClass`时(在中rails console
)。
使用此代码(在控制台模式下):
Gem::Specification.all_names
这是一个非常不错的单行代码,可打印所有Gems以及它们的版本,主页和说明:
Gem::Specification.sort{|a,b| a.name <=> b.name}.map {|a| puts "#{a.name} (#{a.version})"; puts "-" * 50; puts a.homepage; puts a.description; puts "\n\n"};nil
从调试器中键入$LOAD_PATH
您的宝石列表。如果没有调试器,请安装pry:
gem install pry
pry
Pry(main)> $LOAD_PATH
这将输出您已安装的宝石的数组。