Co bundle exec rake db:migrate
znaczy A może bundle exec rake <command>
w ogóle?
Rozumiem, że bundle
dba o utrzymanie rzeczy w Gemfile. Wiem, co znaczy słowo „exec”. Rozumiem, że rake
zachowuje wszystkie różne skrypty rzeczy, które możesz zrobić, i wiem, że db:migrate
to jedna z nich. Po prostu nie wiem, co te wszystkie słowa razem robią. Dlaczego powinienem bundle
zostać użyty do wykonania rake
migracji bazy danych?
źródło
bundle
to jest polecenie, które jest używane przez Bundler..ruby-gemset
plik w katalogu głównym projektu. Istnieje również.ruby-version
plik, który ustawia twoją wersję ruby, jeśli używasz RVM.Używasz
bundle exec
programu. Twórcy programu napisali go, gdy dostępne były niektóre wersje klejnotów. Program Gemfile określa wersje klejnotów, których twórcy postanowili użyć. Oznacza to, że skrypt został poprawnie uruchomiony w przypadku tych wersji klejnotów.Twój system Gemfile może różnić się od tego Gemfile. Możesz mieć nowsze lub starsze klejnoty, z którymi ten skrypt nie gra się dobrze. Ta różnica w wersjach może powodować dziwne błędy.
bundle exec
pomaga uniknąć tych błędów. Wykonuje skrypt przy użyciu klejnotów określonych w pliku Gemfile skryptu, a nie w ogólnodostępnym pliku Gemfile. Wykonuje niektóre wersje klejnotów za pomocą magii aliasów powłoki.Zobacz więcej na stronie man .
Oto przykład Gemfile:
Tutaj
bundle exec
wykonałby skrypt przy użyciu szyny w wersji 2.8.3, a nie jakiejkolwiek innej wersji, którą mogłeś zainstalować w całym systemie.źródło
rake db:migrate
,bundle exec
a następnie uruchomi się przy użyciu ogólnosystemowego pliku Gemfile, w którym można mieć stelaż w wersji 1.5.2 (najnowszej)?bundle exec
używa „specyficznych dla aplikacji”, lokalnych klejnotów w twoim pliku Gem aplikacji ibundle
używa „specyficznych dla maszyny”, globalnych klejnotów, jeśli tak zrobiłeśgem install a_certain_gem
. local vs globalTo pojawia się bardzo często, gdy twój gemfile.lock ma różne wersje klejnotów zainstalowane na twoim komputerze. Możesz otrzymać ostrzeżenie po uruchomieniu prowizji (lub rspec lub innych), takich 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.
Poprzedzenie
bundle exec
opowiada Bundler do wykonania tego polecenia, niezależnie od różnicy wersji. Nie zawsze jest problem, jednak mogą wystąpić problemy.Na szczęście istnieje klejnot, który rozwiązuje ten problem: pakiet pakietowy rubygems.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Następnie wypróbuj ponownie swój rake, rspec lub cokolwiek innego.
źródło
Prawdopodobnie należy wspomnieć, że istnieją sposoby, aby je pominąć
bundle exec
(wszystkie są wymienione w rozdziale 3.6.1 podręcznika Michaela Hartlsa Ruby on Rails ).Najprościej jest po prostu użyć wystarczająco aktualnej wersji RVM (> = 1.11.x).
Jeśli jesteś ograniczony do wcześniejszej wersji RVM, zawsze możesz użyć tej metody wspomnianej również przez calasyr :
bundler_stubs
Katalog powinien następnie zostać dodane do.gitignore
pliku.Trzecią opcją jest użycie
rubygems-bundler
klejnotu, jeśli nie używasz RVM:źródło
Gdy bezpośrednio uruchomisz zadanie prowizji lub wykonasz dowolny plik binarny klejnotu, nie ma gwarancji, że polecenie będzie działało zgodnie z oczekiwaniami. Ponieważ może się zdarzyć, że masz już ten sam klejnot w swoim systemie, który ma wersję powiedzieć 1.0, ale w swoim projekcie masz wyższą wersję powiedz 2.0. W takim przypadku nie można przewidzieć, który zostanie użyty.
Aby wymusić pożądaną wersję klejnotów, skorzystaj z
bundle exec
polecenia, które uruchomiłoby plik binarny w kontekście bieżącego pakietu. Oznacza to, że gdy używasz exec pakietu, bundler sprawdza wersję klejnotu skonfigurowaną dla bieżącego projektu i używa go do wykonania zadania.Napisałem też o tym post , który pokazuje, jak możemy uniknąć używania go za pomocą kodów pośredniczących.
źródło
Nie używałem
bundle exec
dużo, ale jestem ustawienie go teraz.Miałem przypadki, w których użyto niewłaściwej prowizji i traciłem dużo czasu na śledzenie problemu. To pomaga ci tego uniknąć.
Oto jak skonfigurować RVM, abyś mógł
bundle exec
domyślnie korzystać z niego w określonym katalogu projektu:https://thoughtbot.com/blog/use-bundlers-binstubs
źródło
Oznacza to użycie prowizji, o której pakujący jest świadomy i jest częścią pliku Gemfile, w stosunku do prowizji, o której nie jest świadomy, i uruchomienie zadania db: migracja.
źródło