Список встановлених дорогоцінних каменів?


142

Чи є метод Ruby, до якого я можу зателефонувати, щоб отримати список встановлених дорогоцінних каменів?

Я хочу проаналізувати вихід gem list. Чи є інший спосіб зробити це?

Відповіді:


55

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


2
Слід зазначити, що "Dependency.new w / a regexp застаріло" зараз.
Мартін Поляк

351

Тут перераховані всі встановлені нами дорогоцінні камені.

gem query --local

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

Див. 2.7 Перелік усіх встановлених дорогоцінних каменів


37
Коли я дивлюся на оновлення, то ця відповідь - це те, чого хотіла більшість людей. :)
кайзер

4
є краща відповідь у самому питанні gem list.
blueray

gem listзробив саме те, що мені потрібно, і це набагато простіше і простіше згадати, коли ти в CLI. Чому так багато команд зробити одну справу?
Дейв Еверітт

28

І те й інше

gem query --local

і

 ruby -S gem list --local

список 69 записів

Поки

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

дає мені 82

Я раніше wc -lотримував цифри. Не впевнений, чи це правильний спосіб перевірити. Спробував перенаправити вихідний текст на текстові файли, і це не допомогло - доведеться порівнювати один за одним вручну.


1
Причина проста. Перша команда додає лише 1 запис на дорогоцінний камінь і перераховує версії в дужках у тому ж рядку. Остання rubyкоманда перераховує кожну версію дорогоцінного каміння в окремому рядку. Для наприклад: 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
кайзер

10

Для цього існував метод для віків:

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

ruby -e "ставить Gem :: Specification.all_names" дає мені "-e: 1: неініціалізована константа Gem (NameError)" Як це вирішити?
Метагуман

6
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

Це дає NoMethodError: undefined method будь-яке? ' для nil: NilClass`, коли я використовую його (в а rails console).
іконоборство


3

Більш сучасною версією було б використовувати щось подібне до наступного ...

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

ПРИМІТКА: дуже схожа перша частина відповіді Євгена ... але через форматування сторінки, це легко пропустити.


3

Ось приємний однолінійний друк для друку всіх самоцвітів разом із їх версією, домашньою сторінкою та описом:

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


1

Можливо, ви можете отримати файли (дорогоцінні камені) з каталогу дорогоцінних каменів?

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

1

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

gem install pry
pry
Pry(main)> $LOAD_PATH

Це виведе масив встановлених дорогоцінних каменів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.