Список установленных драгоценных камней? - PullRequest
125 голосов
/ 03 марта 2011

Есть ли метод Ruby, который я могу вызвать, чтобы получить список установленных гемов?

Я хочу проанализировать вывод gem list.Есть ли другой способ сделать это?

Ответы [ 11 ]

304 голосов
/ 09 марта 2013

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

gem query --local

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

См. 2.7. Список всех установленных драгоценных камней

50 голосов
/ 03 марта 2011

Команда 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, он возвращает хэш драгоценных камней, где ключ - это имя драгоценного камня, а значение - массив спецификаций драгоценного камня. Значение представляет собой массив экземпляров этого драгоценного камня, который установлен по номеру версии.

Это позволяет делать такие вещи, как:

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, только у вас есть доступ ко всей информации для спецификации конкретного драгоценного камня.

26 голосов
/ 12 марта 2014

Оба

gem query --local

и

 ruby -S gem list --local

список 69 записей

В то время как

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

дает мне 82

Я использовал wc -l, чтобы получить числа. Не уверен, что это правильный способ проверки. Попытка перенаправить вывод в текстовые файлы и diff'ed, но это не помогло - нужно будет сравнить вручную по одному.

9 голосов
/ 25 февраля 2014

Был метод для этого целую вечность:

ruby -e 'puts Gem::Specification.all_names'
5 голосов
/ 24 января 2012
Gem::Specification.map {|a| a.name}

Однако, если ваше приложение использует Bundler, оно вернет только список зависимых локальных драгоценных камней.Чтобы получить все установлено:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
3 голосов
/ 22 декабря 2017

используйте этот код (в режиме консоли):

Gem::Specification.all_names
3 голосов
/ 21 мая 2013

Более современная версия - использовать что-то похожее на следующее ...

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

ПРИМЕЧАНИЕ: очень похож на первую часть ответа Евгения ... но из-за форматирования страницы его легко пропустить.

2 голосов
/ 08 июля 2017

Вот действительно хорошая строчка для печати всех драгоценных камней вместе с их версией, домашней страницей и описанием:

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
2 голосов
/ 06 ноября 2013

Попробуйте в терминале:

ruby -S gem list --local
1 голос
/ 09 января 2016

В вашем отладчике введите $LOAD_PATH, чтобы получить список ваших драгоценных камней.Если у вас нет отладчика, установите pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

. Это выведет массив ваших установленных гемов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...