Co oznacza pakiet exec prowizji?

Co oznacza bundle exec rake db:migrate? Czy tylko bundle exec rake <command> w ogóle?

Rozumiem, że bundle zajmuje się utrzymywaniem rzeczy w Gemfile. Wiem, co oznacza słowo "exec". Rozumiem, że rake utrzymuje wszystkie różne skrypty, które możesz zrobić, i Wiem, że {[4] } jest jednym z nich. Po prostu nie wiem, co te wszystkie słowa robią razem. Dlaczego należy użyć bundle do wykonania rake do wykonania migracji bazy danych?

Author: Andrew Marshall, 2011-07-06

7 answers

bundle exec to Bundlerpolecenie do wykonania skryptu w kontekście bieżącego pakietu (tego z pliku Gemfile w Twoim katalogu). rake db:migrate jest skryptem, w którym db jest przestrzenią nazw, a migrate jest zdefiniowaną nazwą zadania.

Więc bundle exec rake db:migrate wykonuje skrypt rake poleceniem db:migrate w kontekście bieżącego pakietu.

Co do "dlaczego?"Cytuję ze stronybundler :

W niektórych przypadkach, bieganie pliki wykonywalne Bez bundle exec mogą działać, jeśli plik wykonywalny jest zainstalowany w Twoim systemie i nie pobiera żadnych klejnotów, które są sprzeczne z Twoim pakietem.

Jest to jednak niewiarygodne i jest źródłem znacznego bólu. Nawet jeśli wygląda na to, że działa, może nie działać w przyszłości lub na innej maszynie.
 426
Author: ghoppe,
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
2016-01-27 22:46:55

Uruchamiasz bundle exec w programie. Twórcy programu napisali go, gdy dostępne były pewne wersje klejnotów. Program Gemfile Określa wersje klejnotów, których twórcy postanowili użyć. Oznacza to, że skrypt został stworzony tak, aby działał poprawnie przeciwko tym wersjom klejnotów.

Twój Systemowy plik Gemfile może się różnić od tego pliku Gemfile. Możesz mieć nowsze lub starsze klejnoty, z którymi ten skrypt nie gra ładnie. Ta różnica w wersjach może powodować dziwne błędy.

Bundle exec pomaga unikasz tych błędów. Wykonuje skrypt za pomocą klejnotów określonych w pliku GEMFILE skryptu, a nie w całym systemie. Wykonuje pewne wersje klejnotów z magią aliasów powłoki.

Zobacz więcej na stronie man .

Oto przykładowy Gemfile:

source 'http://rubygems.org'

gem 'rails', '2.8.3'

Tutaj bundle exec wykonałby skrypt używając rails w wersji 2.8.3, a nie innej wersji, którą mogłeś zainstalować w całym systemie.

 134
Author: Rose Perrone,
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
2015-12-31 15:42:23

To pojawia się często, gdy twój gemfile.lock ma różne wersje klejnotów zainstalowanych na twoim komputerze. Możesz otrzymać ostrzeżenie po uruchomieniu rake (lub rspec lub innych), takie jak:

You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.

Prepending bundle exec nakazuje bundlerowi wykonanie tej komendy niezależnie od różnicy wersji. Nie zawsze istnieje problem, jednak możesz napotkać problemy.

Na szczęście jest klejnot, który to rozwiązuje: rubygems-bundler.

$ gem install rubygems-bundler

$ $ gem regenerate_binstubs

To spróbuj jeszcze raz rake, rspec, czy coś innego.
 7
Author: Benjamin Dunphy,
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-05-15 02:54:12

Należy chyba wspomnieć, że istnieją sposoby na pominięcie bundle exec (wszystkie zostały opisane w rozdziale 3.6.1 książki Michaela Hartlsa Ruby on Rails Tutorial).

Najprostszym jest użycie odpowiednio aktualnej wersji RVM (>=1.11.x).

Jeśli jesteś ograniczony do wcześniejszej wersji RVM, zawsze możesz użyć tej metody również wymienionej przez calasyr :

$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs

Katalog bundler_stubs powinien być następnie dodany do pliku .gitignore.

Trzecia opcja jest użycie gem rubygems-bundler, jeśli nie używasz RVM:

$ gem install rubygems-bundler
$ gem regenerate_binstubs
 6
Author: tschale,
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
2017-05-23 12:02:51

Nie używałem dużo bundle exec, ale konfiguruję go teraz.

Miałem przypadki, w których użyto niewłaściwej prowizji i wiele czasu zmarnowano na śledzenie problemu. To pomoże ci tego uniknąć.

Oto jak skonfigurować rvm, aby domyślnie używać bundle exec w określonym katalogu projektu:

Http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

 1
Author: calasyr,
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-01-29 08:07:01

Kiedy bezpośrednio uruchomisz zadanie rake lub wykonasz dowolny plik binarny gem, nie ma gwarancji, że komenda będzie zachowywać się zgodnie z oczekiwaniami. Ponieważ może się zdarzyć, że masz już zainstalowany ten sam gem w systemie, który ma wersję powiedzmy 1.0, ale w Twoim projekcie masz wyższą wersję powiedzmy 2.0. W tym przypadku nie można przewidzieć, który z nich będzie używany.

Aby wymusić żądaną wersję gem korzystasz z pomocy bundle exec polecenia, które wykonywałoby binarny w kontekście aktualna paczka. Oznacza to, że gdy używasz bundle exec, bundler sprawdza wersję gem skonfigurowaną dla bieżącego projektu i używa jej do wykonania zadania.

Napisałem też post o tym, który pokazuje również, jak możemy uniknąć korzystania z niego za pomocą stubów bin.

 1
Author: Ajit Singh,
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
2018-05-20 11:09:58

Oznacza to użycie rake 'a, którego bundler jest świadomy i jest częścią Twojego pliku Gemfile nad każdym rake' em, którego bundler nie jest świadomy i uruchomienie zadania db:migrate.

 0
Author: Omar Qureshi,
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
2011-07-05 20:49:14