Użyj pakietu exec prowizji lub po prostu prowizji?
Nauczyłem się Rails używając tylko komendy rake 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ć.
Powinienem używać bundle exec rake
zamiast zwykłego rake
czy jest to tylko kwestia preferencji? Każdy wgląd będzie bardzo mile widziany! Dzięki!
3 answers
bundle exec
wykonuje polecenie w kontekście pakietu.
Oznacza to, że używa klejnotów określonych w Twoim pliku Gemfile. Przez większość czasu uruchamianie bundle exec rake foo
ma takie same wyniki, jak po prostu uruchomione rake foo
, zwłaszcza jeśli masz zainstalowane te same kamienie w całym systemie, co w pliku Gemfile. Jednak niektóre aplikacje mogą określać różne wersje klejnotów niż te, które zainstalowałeś w całym systemie i mogą chcieć, aby te dokładne klejnoty i wersje mogły działać poprawnie. Jeśli biegniesz bez bundle exec
, mogą pojawić się dziwne błędy.
Użycie bundle exec
gwarantuje, że program jest uruchamiany w środowisku określonym w pliku gemfile, co miejmy nadzieję oznacza, że jest to środowisko, w którym twórcy programu chcą go uruchomić, co miejmy nadzieję oznacza, że powinien działać poprawnie bez względu na dziwną konfigurację na komputerze.
Zasadniczo standaryzuje środowisko, w którym program jest uruchamiany. To pomaga uniknąć piekła wersji i sprawia, że życie znacznie łatwiej.
Zobacz http://bundler.io/v1.3/man/bundle-exec.1.html aby uzyskać więcej informacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 12:35:38
$ bundle exec Rake db: migrate
Używa wersji rake określonej w pliku Gemfile do wykonania zadania rake db:migrate
.
ale w pliku Gemfile nie ma określonego klejnotu rake!
Tak, ale gem rake został zainstalowany jako zależność od innego gem -- spójrz w Gemfile.zamek. Tak więc reguła musi być: używa wersji rake określonej w Gemfile.zamek.
Ale Gemfile.lock nie określa konkretnej wersji -- określa wersję większą niż x. y!
Wtedy reguła musi być następująca: używa wersji rake zainstalowanej w bieżącym gemsecie.
$ rake db: migrate
Zwykle, gdy wydajesz polecenie w wierszu poleceń, np. rake, system wyszukuje polecenie na liście katalogów podanych w zmiennej środowiskowej PATH. Pierwszym katalogiem zawierającym polecenie jest używana wersja polecenia. Aby zobaczyć, który to katalog, możesz zrobić:
$ which rake
Więc jeśli execute,
$ rake db:migrate
To Może użyć innego klejnotu rake ' a niż ten, który zainstalowałeś bundle install
. Ale nawet jeśli Twój system znajdzie tę samą wersję rake co bundle exec
, wszelkie klejnoty wymagane przez kod źródłowy rake będą wyszukiwane w miejscach poza gemset twojego projektu. Dlatego istnieje wiele sposobów, które po prostu:
$ rake db:migrate
Może wszystko spieprzyć.
Zgodnie z poradnikiem Ruby on Rails(darmowy Online), sekcja 3.6, jeśli używasz rvm 1.11.x + wtedy nie trzeba przedrukować polecenia za pomocą bundle exec
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 17:47:13
Uruchamianie dowolnej wymagalnej Bez bundle exec
spowoduje, że Rubygems pobierze najnowszą wersję gem zainstalowaną w Twoim systemie.
Dodanie prefiksu bundle exec
spowoduje, że plik wykonywalny zostanie uruchomiony w kontekście pliku Gemfile.lock, co oznacza, że zostanie uruchomiony przy użyciu wersji zdefiniowanej w pliku gem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 15:08:14