Badam aplikację railsową - na serwerze produkcyjnym są zainstalowane dwie wersje określonego klejnotu. Jak mogę sprawdzić, której wersji używa aplikacja prod?
Badam aplikację railsową - na serwerze produkcyjnym są zainstalowane dwie wersje określonego klejnotu. Jak mogę sprawdzić, której wersji używa aplikacja prod?
Odpowiedzi:
W Rails 3 i Rails 4 użyj bundle show
W Railsach 2 rake gems
wypisze jakie klejnoty, zależności i wersje są zainstalowane, zamrożone itp.
bundle show | grep gem_name
, na przykład dla kompasu:bundle show | grep compass
Jeśli korzystasz z pakietu, możesz pobrać wersję z
bundle show [gemname]
bundle info [gemname]
zamiast tego.
Znalezienie i posortowanie tych informacji zajęło mi więcej czasu niż oczekiwano, dlatego chciałem umieścić je tutaj w jednym miejscu, aby inni mogli je przeglądać. Chciałem też trochę to wyjaśnić w przypadku Rails 3:
script / about został zastąpiony przez rake about
Szczegóły tutaj . Jeśli jesteś zainteresowany listą wszystkich zmian w linii poleceń dla Rails 3, można je znaleźć tutaj .
rake gems
nie działa w Railsach 3. Zamiast tego powinieneś użyć bundle show
Na przykład możesz zapisać wszystkie wersje swoich klejnotów do pliku do przeglądania za pomocą:
gem list > all_gems.txt
i możesz zobaczyć, jakich wersji używa Twoja aplikacja Rails:
bundle show > project_gems.txt
Używając edytora, takiego jak Vim, możesz łatwo użyć vimdiff, aby zobaczyć zmiany
Prawdopodobnie istnieje bardziej bezpośredni sposób, aby się tego dowiedzieć, ale jeśli załadujesz konsolę i potrzebujesz określonej wersji, takiej jak ta:
gem 'RedCloth', '3.0.4'
Powie Ci, która wersja jest już aktywowana:
=> Gem::LoadError: can't activate RedCloth (= 3.0.4, runtime) for [], already activated RedCloth-4.2.2
Spróbuj użyć script/about
. Twój config/environment.rb
również ma informacje na ten temat.
W Twoim config/environment.rb
możesz określić, której wersji konkretnej gem
aplikacji ma używać. Jeśli jednak masz wiele wersji programu gem
zainstalowanego na swoim komputerze i nie określisz wersji, najnowsza wersja tego klejnotu będzie używana przez aplikację.
gem list <gemname>
Pokaże wszystkie pasujące kamienie, np. Jeśli ktoś to zrobi
gem list rack
Wtedy wynik będzie następujący
*** LOCAL GEMS ***
rack (1.6.4)
rack-mount (0.6.14)
rack-test (0.6.3, 0.6.2, 0.5.7)
script/about
powie ci, jakich wersji podstawowych Rails i Rack Gems używasz, ale nic więcej. Idealnie, jeśli zajrzysz do config/environment.rb
środka, powinna istnieć sekcja, która wygląda następująco:
# 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"
Przy odrobinie szczęścia autor aplikacji umieści tam wszystkie wymagane klejnoty i wersje. Jednak wersje są opcjonalne w tym pliku i ostatecznie nic nie powstrzymuje niedoświadczonego programisty przed po prostu uderzeniem require 'rubygems'; require 'some_random_thing'
w górę dowolnego pliku.
Jeśli widzisz, że klejnot jest wymagany, ale nie określono wersji, możesz wpisać, gem list
aby zobaczyć wszystkie wersje wszystkich klejnotów w systemie. Domyślnie będzie korzystać z najnowszego dostępnego.
bundle exec gem which gem_name
Prawdopodobnie możesz użyć:
$› 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 Tj. dla urządzenia, które musisz napisać jak
bundle show devise
i wydrukuje aktualną wersję klejnotu.
spróbuj tego dla lokalnego klejnotu:
gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
Jeśli używasz pakietu:
bundle exec gem list gemname | grep -P '(^|\s)\Kgemname(?=\s|$)'
Jeśli używasz bundlera, możesz pobrać wersję za pomocą:
bundle info [gemname]