Sto indagando su un'app rails: il server prod ha due versioni di una gem specifica installata, come posso sapere quale versione sta utilizzando l'app prod?
Sto indagando su un'app rails: il server prod ha due versioni di una gem specifica installata, come posso sapere quale versione sta utilizzando l'app prod?
Risposte:
In Rails 3 e Rails 4, utilizzare bundle show
In Rails 2, rake gems
stamperà quali gem, dipendenze e versioni sono installate, congelate, ecc.
bundle show | grep gem_name
, ad esempio per la bussola:bundle show | grep compass
Se usi il bundler, puoi ottenere la versione da
bundle show [gemname]
bundle info [gemname]
invece.
Mi ci è voluto più tempo del previsto per trovare e ordinare queste informazioni, quindi ho voluto pubblicarle qui in un posto affinché gli altri potessero vederle. Volevo anche chiarire un po 'questo per Rails 3:
script / about è stato sostituito con rake about
I dettagli sono qui . Se sei interessato, un elenco di tutte le modifiche della riga di comando per Rails 3 può essere trovato qui .
rake gems
non funziona in Rails 3. Invece dovresti usare bundle show
Ad esempio, puoi salvare tutte le versioni delle tue gemme in un file per la visualizzazione con:
gem list > all_gems.txt
e puoi vedere quali versioni utilizza la tua app Rails con:
bundle show > project_gems.txt
Usando un editor come Vim puoi facilmente usare vimdiff per vedere le modifiche
Probabilmente esiste un modo più diretto per scoprirlo, ma se carichi una console e richiedi una versione specifica in questo modo:
gem 'RedCloth', '3.0.4'
Ti dirà quale versione è già attivata:
=> Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2
C'è anche un elenco in Gemfile.lock
, situato nella directory principale della tua app.
Per questo motivo lascio Gemfile.lock
fuori il mio .gitignore
. Questo mi ha salvato più di una volta quando ho dimenticato di specificare la versione della gemma in GemFile
e una gemma è stata aggiornata con modifiche di rilievo.
Prova a usare script/about
. Il tuo config/environment.rb
ha anche informazioni su di esso.
Nel tuo config/environment.rb
puoi specificare quale versione di una particolare gem
applicazione dovrebbe usare. Tuttavia, se hai più versioni di un gem
installato sulla tua macchina e non specifichi la versione, l'ultima versione di quella gemma verrà utilizzata dall'applicazione.
gem list <gemname>
Mostrerà tutte le gemme corrispondenti, ad esempio se qualcuno lo fa
gem list rack
Quindi l'output sarà il seguente
*** LOCAL GEMS ***
rack (1.6.4)
rack-mount (0.6.14)
rack-test (0.6.3, 0.6.2, 0.5.7)
script/about
ti dirà quali versioni delle gemme principali di Rails e Rack stai usando, ma non nient'altro. Idealmente, se guardi dentro config/environment.rb
, dovrebbe esserci una sezione simile a questa:
# 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 po 'di fortuna, l'autore dell'app avrà incluso tutte le gemme e le versioni richieste. Tuttavia, le versioni sono opzionali in questo file e alla fine nulla impedisce a uno sviluppatore inesperto di semplicemente schiaffeggiare un require 'rubygems'; require 'some_random_thing'
all'inizio di un dato file.
Se vedi che è richiesta una gemma, ma non è specificata alcuna versione, puoi digitare gem list
per vedere tutte le versioni di tutte le gemme sul sistema. Per impostazione predefinita, utilizzerà l'ultimo disponibile.
bundle exec gem which gem_name
Probabilmente è quello che puoi usare:
$› bundle exec gem which rails
/Users/xxxx/.rvm/gems/ruby-2.1.2@gemset/gems/railties-4.1.7/lib/rails.rb
gem which gem_name
bundle show gemname Ie per devise devi scrivere come
bundle show devise
e stamperà la versione gemma corrente.
prova questo per gemma locale:
gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
Se usi bundle:
bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
Se usi il bundler, puoi ottenere la versione usando:
bundle info [gemname]