Проверка, установлен ли гем ruby ​​из скрипта bash

14

Мне нужно, из скрипта bash, проверить, установлены ли определенные гемы Ruby.

Я думал, что мог сделать что-то вроде

if ! gem list <name>; then do_stuff; fi

но тестирование с использованием командной строки echo $?показывает, что gem list <name>возвращает 0 независимо от того, действительно ли найдено имя.

Означает ли это, что я должен использовать grep для фильтрации вывода списка драгоценных камней, или есть лучший способ проверить, установлен ли гем?

Ли Лоудер
источник

Ответы:

26

gem list <name> -iвернет строку, trueесли гем установлен и в falseпротивном случае. Кроме того, коды возврата - это то, что вы ожидаете.

Для получения дополнительной информации см gem help list.


Изменить: @Riateche правильно заметил, что это может дать ложные срабатывания, если вы ищете имя драгоценного камня, который является подстрокой установленного в противном случае драгоценного камня. Чтобы избежать этого, используйте синтаксис регулярных выражений:

gem list '^<name>$' -i

(Пример:) gem list '^mini$' -i.

Свен
источник
1
Чтобы проверить, установлена ли конкретная версия, просто добавить --version, например: gem list -i compass --version 0.12.4.
moeffju
6

Выглядит так, как будто gem specкоманда завершится с ошибкой, если указанный гем не установлен. Так:

if ! gem spec <name> > /dev/null 2>&1; then
  echo "Gem <name> is not installed!"
fi

Я не знаю, является ли это каноническим способом решения этого, но это работает.

larsks
источник
3

Вы также можете использовать queryподкоманду к gemкоманде.

$ gem query -i -n bundler 
true
выдержка из использования
$ gem help query
Usage: gem query [options]

  Options:
    -i, --[no-]installed             Check for installed gem
    -I                               Equivalent to --no-installed
    -v, --version VERSION            Specify version of gem to query
                                     for use with --installed
    -n, --name-matches REGEXP        Name of gem(s) to query on matches the
                                     provided REGEXP

Также будет искать конкретные версии, используя -vпереключатель.

$ gem query -i -n bundler -v 1.6.2.1
false
ОДС
источник
1
Извиняюсь за понижение рейтинга, но, как сказано в справочной странице для gem query: «Команда запроса является основой для команд списка и поиска. Вам действительно следует вместо этого использовать команды списка и поиска. Эту команду слишком сложно использовать». ... не хочу создавать вредных привычек в SO сообществе! :-)
pvandenberk