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 gemsstamperà 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.lockfuori il mio .gitignore. Questo mi ha salvato più di una volta quando ho dimenticato di specificare la versione della gemma in GemFilee una gemma è stata aggiornata con modifiche di rilievo.
Prova a usare script/about. Il tuo config/environment.rbha anche informazioni su di esso.
Nel tuo config/environment.rbpuoi specificare quale versione di una particolare gemapplicazione dovrebbe usare. Tuttavia, se hai più versioni di un geminstallato 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/aboutti 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 listper 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]