Есть ли способ Ruby, который я могу вызвать, чтобы получить список установленных камней?
Я хочу проанализировать вывод gem list
. Есть ли другой способ сделать это?
Есть ли способ Ruby, который я могу вызвать, чтобы получить список установленных камней?
Я хочу проанализировать вывод gem list
. Есть ли другой способ сделать это?
Теперь команда 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 = "[email protected]"
# 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 query --local
http://guides.rubygems.org/command-reference/#gem-list
См. 2.7 Список всех установленных камней
И
gem query --local
и
ruby -S gem list --local
список 69 записей
В то время как
ruby -e 'puts Gem::Specification.all_names'
дает мне 82
Я использовал wc -l
для получения чисел. Не уверен, что это правильный способ проверить. Пытался перенаправить вывод в текстовые файлы и отличился, но это не помогло - нужно будет вручную сравнивать один за другим.
На протяжении веков существовал метод:
ruby -e 'puts Gem::Specification.all_names'
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
Более современная версия будет использовать что-то похожее на следующее...
require 'rubygems'
puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') }
ПРИМЕЧАНИЕ: очень похоже на первую часть ответа Евгения... но из-за форматирования страницы легко пропустить.
одной командой (в режиме консоли):
Gem::Specification.all_names
Попробуйте в терминале:
ruby -S gem list --local
Вот действительно хорошая строчка для печати всех драгоценных камней вместе с их версией, домашней страницей и описанием:
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
Возможно, вы можете получить файлы (драгоценные камни) из каталога драгоценных камней?
gemsdir = "gems directory"
gems = Dir.new(gemsdir).entries
Из вашего типа отладки $LOAD_PATH
, чтобы получить список ваших драгоценных камней. Если у вас нет отладчика, установите pry:
gem install pry
pry
Pry(main)> $LOAD_PATH
Это выведет массив ваших установленных камней.