$ bundle exec rake db: migrate
Używa wersji rake określonej w pliku Gemfile do wykonania zadania rake db:migrate
.
Ale w Gemfile nie ma określonego klejnotu rake!
Tak, ale klejnot rake został zainstalowany jako zależność od innego klejnotu - spójrz na Gemfile.lock. Zatem zasada musi być następująca: Używa wersji prowizji określonej w Gemfile.lock.
Ale Gemfile.lock nie określa konkretnej wersji - określa wersję większą niż xy!
W takim przypadku reguła musi być następująca: Używa wersji prowizji zainstalowanej w obecnym gemset.
$ rake db: migrate
Zwykle, kiedy wydajesz komendę w linii komend, np. rake, twój system szuka komendy na liście katalogów określonej w zmiennej środowiskowej PATH. Pierwszym katalogiem zawierającym polecenie jest wersja używanego polecenia. Aby zobaczyć, który to katalog, możesz zrobić:
$ which rake
Więc jeśli wykonasz,
$ rake db:migrate
który może używać innego klejnotu rake niż ten, z którym zainstalowałeś bundle install
. Ale nawet jeśli twój system znajdzie tę samą wersję rake bundle exec
, jakikolwiek klejnot wymagany przez kod źródłowy prowizji będzie przeszukiwany w miejscach poza gemsetem twojego projektu. Dlatego istnieje wiele sposobów, które po prostu:
$ rake db:migrate
może coś schrzanić.
Zgodnie z podręcznikiem Ruby on Rails (dostępnym bezpłatnie online), sekcja 3.6, jeśli używasz rvm 1.11.x +, nie musisz poprzedzać poleceń przedrostkiem bundle exec
.