已安装的宝石清单?

有没有一个 Ruby 方法,我可以调用来获得安装的 gems 列表?

我想解析 gem list的输出。

还有别的办法吗?

208012 次浏览

也许您可以从 gems 目录中获取文件(gems) ?

gemsdir = "gems directory"
gems = Dir.new(gemsdir).entries

Gem 命令现在包含在 Ruby 1.9 + 中,是 Ruby pre-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 的散列,其中键是 gem 的名称,值是 gem 规范的数组。该值是已安装的 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::Specification.map {|a| a.name}

但是,如果你的应用程序使用 Bundler,它将只返回 受供养人本地 gems 列表:

def all_installed_gems
Gem::Specification.all = nil
all = Gem::Specification.map{|a| a.name}
Gem::Specification.reset
all
end

这里列出了我安装的所有 Gems。

gem query --local

Http://guides.rubygems.org/command-reference/#gem-list

列出所有已安装的 gem

一个更现代的版本是使用类似于下面这样的东西..。

require 'rubygems'
puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') }

注意: 非常相似的第一部分的回答叶夫根尼... 但由于页面格式,它很容易错过。

在终端机试试看:

ruby -S gem list --local

这种方法已经有很多年了:

ruby -e 'puts Gem::Specification.all_names'

都有

gem query --local

还有

 ruby -S gem list --local

列出69个条目

同时

ruby -e 'puts Gem::Specification.all_names'

82

我用 wc -l得到了号码。不知道这样检查是否正确。尝试重定向输出到文本文件和差异,但没有帮助-将需要一个一个手动比较。

在调试器中键入 $LOAD_PATH以获取 gem 的列表。如果没有调试器,安装 pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

这将输出已安装的 gem 的数组。

这里有一个非常好的一行程序来打印所有的 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

使用此代码(在控制台模式下) :

Gem::Specification.all_names