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!

Author: mbigras, 2011-11-26

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.

 106
Author: jergason,
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.

 5
Author: 7stud,
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.

 1
Author: pastullo,
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