Como saber qual versão de uma gema um aplicativo Rails está usando


116

Estou investigando um aplicativo rails - o servidor prod tem duas versões de uma gem específica instalada, como posso saber qual versão o aplicativo prod está usando?


Você está perguntando qual versão do rails, ou qual versão de alguma outra gema?
BJ Clark

1
Qual versão de uma joia particular.
Steve Brewer,

Eu tenho uma gema congelada em fornecedores / gemas e, em seguida, tenho uma versão mais recente da gema instalada no local de gemas padrão. Estou olhando em algo dos trilhos que diz "Eu carreguei esta joia deste local".
Steve Brewer,

Respostas:


172

No Rails 3 e Rails 4, use bundle show

No Rails 2, rake gemsimprimirá quais gems, dependências e versões estão instaladas, congeladas, etc.


2
Isso só funcionará se a gema tiver sido especificada no arquivo environment.rb. Se o desenvolvedor apenas solicitar em algum lugar, as joias de rake não funcionarão.
John Hyland,

(Ou em um dos arquivos config / environment / *, dependendo do seu RAILS_ENV.)
John Hyland

2
Se quiser filtrar a lista bundle show | grep gem_name, faça , por exemplo, para bússola:bundle show | grep compass
Adam Waite

Então, o que significa quando você digita bundle show e obtém um monte de Gems com versões incluindo "rails 2.3.17) e você digita rake gems e obtém o que parece ser uma legenda (I = Instalado, etc), mas sem gems / versões? Eu tenho rails versão 2 ou não? Talvez eu tenha rails versão 2 e um bundler mais avançado? Isso é bom / ruim? (Sim, eu sei que é ruim ter uma versão tão antiga do rails, quero saber se é catastrófico ter trilhos e bundler incompatíveis (se for).
Brenda J. Butler

39

Se você usa bundler, pode obter a versão de

bundle show [gemname]

Cheguei a esta questão porque estou tentando mudar para bundler (provavelmente muitas pessoas também, porque Heroku agora exige isso)
GreenAsJade

Isso está obsoleto. Use em seu bundle info [gemname]lugar.
Collimarco

37

Levei mais tempo do que o esperado para encontrar e classificar essas informações, então eu queria postá-las aqui em um lugar para que outras pessoas as vissem. Eu também queria esclarecer isso um pouco para Rails 3:

  • script / about foi substituído por rake about Os detalhes estão aqui . Se você estiver interessado, uma lista de todas as mudanças de linha de comando para Rails 3 pode ser encontrada aqui .

  • rake gems não funciona no Rails 3. Em vez disso, você deve usar bundle show

Por exemplo, você pode salvar todas as versões de suas joias em um arquivo para visualização com:

gem list > all_gems.txt

e você pode ver quais versões seu aplicativo Rails está usando com:

bundle show > project_gems.txt

Usando um editor como o Vim, você pode facilmente usar o vimdiff para ver as mudanças


6

Provavelmente existe uma maneira mais direta de descobrir isso, mas se você carregar um console e exigir uma versão específica como esta:

gem 'RedCloth', '3.0.4'

Ele dirá qual versão já está ativada:

=> Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2

6

No terminal

  bundle show <gem-name>
  bundle show | grep <gem-name>

ou

  gem list | grep <gem-name>

Por exemplo:

  bundle show rails
  bundle show | grep rails

  gem list | grep rails

5

Há também uma lista no Gemfile.lock, localizada no diretório raiz do seu aplicativo.

Por isso deixo de Gemfile.lockfora do meu .gitignore. Isso me salvou mais de uma vez quando esqueci de especificar a versão da gema no GemFile, e uma gema foi atualizada com mudanças importantes.


4

Tente usar script/about. Você config/environment.rbtambém tem informações sobre isso.

Em seu, config/environment.rbvocê pode especificar qual versão de um determinado gemaplicativo deve usar. No entanto, se você tiver várias versões de um geminstalado em sua máquina e não especificar a versão, a versão mais recente dessa gem será usada pelo aplicativo.


3
gem list <gemname>

Irá mostrar todas as joias correspondentes, por exemplo, se alguém fizer

gem list rack

Então, a saída será a seguinte

*** LOCAL GEMS ***

rack (1.6.4)
rack-mount (0.6.14)
rack-test (0.6.3, 0.6.2, 0.5.7)

2

script/aboutdirá quais versões das gemas principais do Rails e Rack você está usando, mas nada mais. Idealmente, se você olhar para dentro config/environment.rb, deve haver uma seção semelhante a esta:

# 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"

Com alguma sorte, o autor do aplicativo terá incluído todas as gemas e versões necessárias. No entanto, as versões são opcionais neste arquivo e, em última análise, nada impede um desenvolvedor inexperiente de simplesmente colocar um require 'rubygems'; require 'some_random_thing'no topo de qualquer arquivo.

Se você vir que uma gema está sendo necessária, mas nenhuma versão foi especificada, você pode digitar gem listpara ver todas as versões de todas as gemas no sistema. Por padrão, ele usará o mais recente disponível.


O seu script / about fala sobre joias? O meu apenas me diz qual versão de ruby, rails e ambiente estou usando.
BJ Clark

Certo, Rails (e Rack) são joias, e script / about dirá quais versões deles estão rodando, junto com as coisas principais do Rails (ActiveSupport, etc), mas não contará a você sobre outras joias. Desculpe se não ficou claro.
John Hyland

1
bundle exec gem which gem_name

Provavelmente é o que você pode usar:

$ bundle exec gem which rails
/Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb

Eu estava procurando informações sobre qual versão de um gem instalado globalmente estava sendo executado em uma pasta arbitrária e isso me levou ao que acredito ser a solução correta -gem which gem_name
cori

1

bundle show gemname Ie, para inventar você tem que escrever como

bundle show devise

e imprimirá a versão gem atual.


0

experimente este para gema local:

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

Se você usar o pacote:

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

0

Na versão mais recente, usado bundle show gem_name

[DEPRECATED] use `bundle info gem_name` instead of `bundle show gem_name`

0

Se você usa bundler, pode obter a versão usando:

bundle info [gemname]

-8

No Gemfile, deve haver a resposta:

gem 'rails', '4.0.0.rc1'

2
Gemfilenem sempre declarará explicitamente um número de versão.
Tass
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.