Verificando se um ruby gem está instalado a partir do script bash

14

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

Eu achei que poderia fazer algo como

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

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

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

    
por Lee Lowder 22.05.2012 / 23:52

3 respostas

25

gem list <name> -i retornará a string true se a gem estiver instalada e false caso contrário. Além disso, os códigos de retorno são o que você esperaria.

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

Editar: @Riateche corretamente observou que isso pode dar falsos positivos se você procurar por um nome de gem que seja uma substring de uma jóia de outra forma instalada. Para evitar isso, use uma sintaxe de regex:

gem list '^<name>$' -i

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

    
por 23.05.2012 / 00:19
6

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

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

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

    
por 23.05.2012 / 00:19
3

Você também pode usar o subcomando query no comando gem .

$ 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, usando a opção -v .

$ gem query -i -n bundler -v 1.6.2.1
false
    
por 30.07.2014 / 18:28

Tags