Verificando se uma gema ruby ​​está instalada a partir do script bash

14

Eu preciso, a partir de um script bash, verificar se certas gemas Ruby estão instaladas.

Eu pensei que poderia fazer algo como

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

mas o teste na linha de comando usando echo $?shows mostra que gem list <name>retorna 0, independentemente de o nome ser realmente encontrado.

Isso significa que eu tenho que usar o grep para filtrar a saída da lista de gemas, ou existe uma maneira melhor de verificar se uma gema está instalada?

Lee Lowder
fonte

Respostas:

26

gem list <name> -iretornará a string truese a gema estiver instalada ou falsenão. Além disso, os códigos de retorno são o que você esperaria.

Para mais informações, consulte gem help list.


Edit: @Riateche observou corretamente que isso pode dar falsos positivos se você procurar um nome de gema que seja uma subcadeia de uma gema instalada de outra forma. Para evitar isso, use uma sintaxe regex:

gem list '^<name>$' -i

(Exemplo:) gem list '^mini$' -i.

Sven
fonte
1
Para verificar se uma versão específica está instalado, basta adicionar --version, por exemplo: gem list -i compass --version 0.12.4.
moeffju
6

Parece que o gem speccomando falhará com um erro se a gema nomeada não estiver instalada. Então:

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

Não sei se essa é a maneira canônica de resolver isso, mas funciona.

larsks
fonte
3

Você também pode usar o querysubcomando para o gemcomando.

$ gem query -i -n bundler 
true
trecho de uso
$ 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

Também procurará versões específicas também, usando o -vswitch.

$ gem query -i -n bundler -v 1.6.2.1
false
slm
fonte
1
Desculpas pelo voto negativo, mas conforme declarado na página de manual para gem query: "O comando query é a base dos comandos list e search. Você realmente deve usar os comandos list e search em vez disso. Este comando é muito difícil de usar." ... não quer criar maus hábitos na comunidade SO! :-)
pvandenberk