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 foo
daje 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 exec
gwarancji, ż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 .
bundle exec
jest to, że powie Ci również, czy powinieneś uruchomićbundle install
instalację wersji klejnotów, których brakuje, w porównaniu z plikiem Gemfile.lock.$ 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ę rakebundle 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
.źródło
uruchomienie dowolnego programu bez użycia
bundle exec
spowoduje, że Rubygems pobierze najnowszą wersję klejnotu zainstalowaną w twoim systemie.Dodanie
bundle exec
prefiksu 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.źródło