Cómo saber qué versión de una gema está usando una aplicación rails


Estoy investigando una aplicación rails - el servidor prod tiene dos versiones de una gema específica instalada, ¿cómo puedo saber qué versión está usando la aplicación prod?

Author: Steve Brewer, 2009-10-25

12 answers

En Rails 3 y Rails 4, use bundle show

En Rails 2, rake gems imprimirá qué gemas, dependencias y versiones están instaladas, congeladas, etc.

 152
Author: BJ Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 16:09:45

Me llevó más tiempo de lo esperado encontrar y ordenar esta información, así que quería publicarla aquí en un lugar para que otros la vieran. También quería aclarar esto un poco para Rails 3:

  • Script / about ha sido reemplazado por rake about Los detalles son aquí. Si está interesado puede encontrar una lista de todos los cambios en la línea de comandos para Rails 3 aquí.

  • rake gems no funciona en Rails 3. En su lugar, debe usar bundle show

Como ejemplo, puede guardar todas las versiones de sus gemas en un archivo para verlas con:

gem list > all_gems.txt

Y puedes ver con qué versiones está usando tu aplicación Rails:

bundle show > project_gems.txt

Usando un editor como Vim puedes usar fácilmente vimdiff para ver los cambios

 37
Author: SnapShot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 15:19:20

Si usa bundler, entonces puede obtener la versión de

bundle show [gemname]
 36
Author: Stina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-18 20:39:16

En el terminal

gem list | grep xxx

O

bundle show | grep xxx

Xxx debe reemplazarse como nombre de gema que va a buscar

 6
Author: rjackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-09 15:50:52

Probablemente haya una forma más directa de averiguar esto, pero si carga una consola y requiere una versión específica como esta:

gem 'RedCloth', '3.0.4'

Te dirá qué versión ya está activada:

=> Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2
 5
Author: gtd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-25 17:42:18

También hay una lista en Gemfile.lock, ubicada en el directorio raíz de tu aplicación.

Por esta razón dejo Gemfile.lock fuera de mi .gitignore. Esto me ha salvado más de una vez cuando olvidé especificar la versión de la gema en GemFile, y una gema se actualizó con cambios bruscos.

 5
Author: SooDesuNe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-18 20:56:50

Intenta usar script/about. Su config/environment.rb también tiene información al respecto.

En su config/environment.rb puede especificar qué versión de un gem particular debe usar la aplicación. Sin embargo, si tiene varias versiones de un gem instalado en su máquina y no especifica la versión, la aplicación utilizará la versión más reciente de esa gema.

 4
Author: Waseem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-26 05:15:48
gem list <gemname>

Mostrará todas las gemas coincidentes, por ejemplo, si alguna lo hace

gem list rack

Entonces la salida th será la siguiente

*** LOCAL GEMS ***

rack (1.6.4)
rack-mount (0.6.14)
rack-test (0.6.3, 0.6.2, 0.5.7)
 3
Author: ImranNaqvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-07 07:54:08

script/about te dirá qué versiones de los Rails principales y gemas de Rack estás usando, pero no nada más. Idealmente, si miras en config/environment.rb, debería haber una sección que se vea así:

# Specify gems that this application depends on and have them installed with rake gems:install
# config.gem "bj"
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
# config.gem "sqlite3-ruby", :lib => "sqlite3"
# config.gem "aws-s3", :lib => "aws/s3"

Con un poco de suerte, el autor de la aplicación habrá incluido las gemas y versiones necesarias allí. Sin embargo, las versiones son opcionales en este archivo, y en última instancia, nada detiene a un desarrollador inexperto de simplemente abofetear un require 'rubygems'; require 'some_random_thing' en la parte superior de cualquier archivo dado.

Si ves que una gema se requiere, pero no se especifica ninguna versión, puede escribir gem list para ver todas las versiones de todas las gemas en el sistema. De forma predeterminada, utilizará el último disponible.

 2
Author: John Hyland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-25 21:39:49
bundle exec gem which gem_name

Es probablemente lo que puedes usar:

$› bundle exec gem which rails
/Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb
 1
Author: JAR.JAR.beans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-24 10:55:00

Prueba esta para la gema local:

gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'

Si utiliza bundle:

bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
 0
Author: Sunil shakya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-26 09:59:59

En Gemfile, debería haber la respuesta:

gem 'rails', '4.0.0.rc1'
 -8
Author: gprasant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 11:05:00