Comprobando si una gema de rubí está instalada desde el script bash

14

Necesito, desde un script bash, verificar para ver si están instaladas ciertas gemas Ruby.

Pensé que podría hacer algo como

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

pero la prueba en la línea de comando usando echo $?muestra que gem list <name>devuelve 0 independientemente de si el nombre se encuentra realmente

¿Esto significa que tengo que usar grep para filtrar la salida de la lista de gemas, o hay una mejor manera de verificar si una gema está instalada?

Lee Lowder
fuente

Respuestas:

26

gem list <name> -idevolverá la cadena truesi la gema está instalada y de lo falsecontrario. Además, los códigos de retorno son lo que cabría esperar.

Para más información, ver gem help list.


Editar: @Riateche observó correctamente que esto podría dar falsos positivos si busca un nombre de gema que sea una subcadena de una gema instalada de otra manera. Para evitar esto, use una sintaxis de expresiones regulares:

gem list '^<name>$' -i

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

Sven
fuente
1
Para comprobar si se ha instalado una versión específica, sólo tiene que añadir --version, por ejemplo: gem list -i compass --version 0.12.4.
moeffju
6

Parece que el gem speccomando fallará con un error si la gema nombrada no está instalada. Entonces:

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

No sé si esta es la forma canónica de resolver esto, pero funciona.

larsks
fuente
3

También puede usar el querysubcomando para el gemcomando.

$ gem query -i -n bundler 
true
extracto 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

También buscará versiones específicas, utilizando el -vinterruptor.

$ gem query -i -n bundler -v 1.6.2.1
false
slm
fuente
1
Disculpas por el voto negativo, pero como se indica en la página de manual para gem query: "El comando de consulta es la base de los comandos de lista y búsqueda. Realmente debería usar los comandos de lista y búsqueda. Este comando es demasiado difícil de usar". ... no quiero crear malos hábitos en la comunidad SO! :-)
pvandenberk