Jak sprawdzić, której wersji klejnotu używa aplikacja Rails

116

Badam aplikację railsową - na serwerze produkcyjnym są zainstalowane dwie wersje określonego klejnotu. Jak mogę sprawdzić, której wersji używa aplikacja prod?

Steve Brewer
źródło
Pytasz, która wersja szyn, lub która wersja innego klejnotu?
BJ Clark
1
Która wersja konkretnego klejnotu.
Steve Brewer
Mam klejnot zamrożony pod sprzedawcami / klejnotami, a następnie mam nowszą wersję klejnotu zainstalowaną w domyślnej lokalizacji klejnotów. Patrzę na coś z szyn, które mówi „załadowałem ten klejnot z tego miejsca”.
Steve Brewer

Odpowiedzi:

172

W Rails 3 i Rails 4 użyj bundle show

W Railsach 2 rake gemswypisze jakie klejnoty, zależności i wersje są zainstalowane, zamrożone itp.

BJ Clark
źródło
2
To zadziała tylko wtedy, gdy klejnot został określony w pliku environment.rb. Jeśli deweloper po prostu gdzieś tego zażądał, klejnoty rake nie będą działać.
John Hyland
(Lub w jednym z plików config / environment / *, w zależności od twojego RAILS_ENV.)
John Hyland
2
Jeśli chcesz przefiltrować listę, zrób to bundle show | grep gem_name, na przykład dla kompasu:bundle show | grep compass
Adam Waite,
Więc co to znaczy, kiedy wpisujesz pakiet show i dostajesz kilka klejnotów z wersjami zawierającymi „rails 2.3.17) i wpisujesz rake gems i otrzymujesz coś, co wygląda jak legenda (I = zainstalowane itp.), Ale bez klejnotów / wersje? Czy mam szyny w wersji 2 czy nie? Może mam szyny w wersji 2 i bardziej zaawansowany pakiet? Czy to dobrze / źle? (Tak, wiem, że źle jest mieć taką starą wersję szyn, chcę wiedzieć czy katastrofa jest mieć takie niedopasowane (jeśli są) szyny i wiązkę).
Brenda J. Butler,
39

Jeśli korzystasz z pakietu, możesz pobrać wersję z

bundle show [gemname]
Stina
źródło
Doszedłem do tego pytania, ponieważ próbuję przejść na bundler (prawdopodobnie wiele osób też, ponieważ Heroku teraz tego wymaga)
GreenAsJade
To jest przestarzałe. Użyj bundle info [gemname]zamiast tego.
collimarco
37

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

Migawka
źródło
6

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
gtd
źródło
6

W terminalu

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

lub

  gem list | grep <gem-name>

Na przykład:

  bundle show rails
  bundle show | grep rails

  gem list | grep rails
Xing
źródło
5

Jest też lista Gemfile.lock, znajdująca się w katalogu głównym Twojej aplikacji.

Z tego powodu pomijam Gemfile.lockmoje .gitignore. To uratowało mnie więcej niż raz, kiedy zapomniałem podać wersję klejnotu w programie GemFile, a klejnot został zaktualizowany o przełomowe zmiany.

SooDesuNe
źródło
4

Spróbuj użyć script/about. Twój config/environment.rbrównież ma informacje na ten temat.

W Twoim config/environment.rbmożesz określić, której wersji konkretnej gemaplikacji ma używać. Jeśli jednak masz wiele wersji programu gemzainstalowanego na swoim komputerze i nie określisz wersji, najnowsza wersja tego klejnotu będzie używana przez aplikację.

Waseem
źródło
3
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)
ImranNaqvi
źródło
2

script/aboutpowie 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 listaby zobaczyć wszystkie wersje wszystkich klejnotów w systemie. Domyślnie będzie korzystać z najnowszego dostępnego.

John Hyland
źródło
Czy twój scenariusz / about mówi ci o klejnotach? Mój tylko mówi mi, jakiej wersji rubinu, szyn i środowiska używam.
BJ Clark
Tak, Railsy (i Rack) są klejnotami, a skrypt / about powie Ci, jakie wersje są uruchomione, wraz z podstawowymi funkcjami Railsów (ActiveSupport itp.), Ale nie powie Ci o żadnych innych klejnotach. Przepraszam, jeśli to nie było jasne.
John Hyland
1
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
JAR.JAR.beans
źródło
Szukałem informacji o tym, która wersja globalnie zainstalowanego klejnotu była uruchamiana w dowolnym folderze i to doprowadziło mnie do tego, co uważam za właściwe rozwiązanie -gem which gem_name
cori
1

bundle show gemname Tj. dla urządzenia, które musisz napisać jak

bundle show devise

i wydrukuje aktualną wersję klejnotu.

Bilal A.Awan
źródło
0

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|$)'
Sunil shakya
źródło
0

W nowszej wersji używany bundle show gem_name

[DEPRECATED] use `bundle info gem_name` instead of `bundle show gem_name`
aldrien.h
źródło
0

Jeśli używasz bundlera, możesz pobrać wersję za pomocą:

bundle info [gemname]
collimarco
źródło
-8

W Gemfile powinna być odpowiedź:

gem 'rails', '4.0.0.rc1'
gprasant
źródło
2
Gemfilenie zawsze jawnie deklaruje numer wersji.
Tass