Użyć pakietu exec rake czy po prostu rake?

84

Nauczyłem się Railsów używając tylko polecenia rake, takiego jak rake db:migrate; jednak przeczytałem, że powinienem używać bundle exec rake ...zamiast zwykłego rake. Teraz nie wiem, którego użyć.

Czy powinienem używać bundle exec rakezamiast zwykłego, rakeczy jest to tylko preferencja? Każdy wgląd byłby bardzo mile widziany! Dzięki!

agentbanks217
źródło

Odpowiedzi:

129

bundle exec wykonuje polecenie w kontekście twojego pakietu.

Oznacza to, że używa klejnotów określonych w twoim pliku klejnotów. W większości przypadków bieganie bundle exec rake foodaje takie same wyniki, jak po prostu bieganie rake foo, zwłaszcza jeśli masz te same klejnoty zainstalowane w całym systemie, co w pliku Gemfile. Jednak niektóre aplikacje mogą określać inne wersje klejnotów niż te, które zainstalowałeś w całym systemie i mogą chcieć, aby te same klejnoty i wersje działały poprawnie. Jeśli po prostu biegasz bez bundle exec, możesz dostać dziwne błędy.

Korzystanie z bundle execgwarancji, że program działa w środowisku określonym w gemfile, co miejmy nadzieję oznacza, że ​​jest to środowisko, w którym twórcy programu chcą, aby był uruchamiany, co miejmy nadzieję oznacza, że ​​powinien działać poprawnie bez względu na to, na jakiej dziwnej konfiguracji masz Twój komputer.

Zasadniczo standaryzuje środowisko, w którym program jest uruchamiany. Pomaga to uniknąć piekła wersji i znacznie ułatwia życie.

Więcej informacji można znaleźć pod adresem http://bundler.io/v1.3/man/bundle-exec.1.html .

jergason
źródło
4
Jeśli zmęczy Cię ciągłe wpisywanie bundle exec, możesz skonfigurować rvm, więc nie jest to konieczne: ruby.railstutorial.org/chapters/…
Lance Fisher
1
Uwaga: Strona podręcznika pakietu została zmieniona, poprawna na tę datę to: bundler.io/v1.3/man/bundle-exec.1.html
Americo Savinon.
1
Przyjemnym efektem ubocznym używania bundle execjest to, że powie Ci również, czy powinieneś uruchomić bundle installinstalację wersji klejnotów, których brakuje, w porównaniu z plikiem Gemfile.lock.
Jay Mitchell
Bardzo dobrze to wyjaśniłeś. Dzięki.
Arup Rakshit
5

$ 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.

7stud
źródło
1

uruchomienie dowolnego programu bez użycia bundle execspowoduje, że Rubygems pobierze najnowszą wersję klejnotu zainstalowaną w twoim systemie.

Dodanie bundle execprefiksu spowoduje, że plik wykonywalny będzie działał w kontekście twojego Gemfile.lock, co oznacza, że ​​zostanie uruchomiony przy użyciu wersji zdefiniowanej w pliku gem.

pastullo
źródło