2012-06-20 10 views

Odpowiedz

23

W swojej konkretnego przykład mogą one być traktowane tak samo, jednak w rzeczywistości nie są takie same .

bundle exec wprowadza pewne zmiany w środowisku, których nie wykonuje bundler/setup. Jeśli twoje foo.rb nigdy nie uruchamia podpowłoki lub nigdy nie próbuje uruchomić innych plików wykonywalnych ruby ​​w podpowłokach, to obie wersje są równoważne (oba ładują prawidłowo powiązane paczki i działają dokładnie tak samo).

Cały pomysł z bundle exec jest, aby umożliwić Ci run wykonywalnych że nie zostały pierwotnie zaprojektowane z myślą Bundler. Podobnie jak rspec, rails, rackup. Jeśli twoja własna aplikacja (foo.rb) nie próbuje uruchomić takich plików wykonywalnych, które mogą być zależne od twoich pakietów, to nie robi to żadnej różnicy. Ponieważ wszystko, co chcesz mieć pewność, z bundler jest to, że ładujesz odpowiednie klejnoty, a do tego bundler/setup działa dokładnie zgodnie z oczekiwaniami w twoim przypadku.

Z bundler docs kiedy mówi o bieganiu wykonywalne systemu Ruby

w niektórych przypadkach działa wykonywalne bez wiązki Exec może działać, jeśli plik wykonywalny zdarza być zainstalowany w systemie, a nie ciągnąć w żadnej perełki konflikt 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.

Następnie z manpage of bundle exec można uzyskać kilka dodatkowych wskazówek co do tego, co bundle exec faktycznie robi:

ŚRODOWISKO modyfikacje

  • upewnić się, że nadal jest możliwe, aby zapłacić do bundle od wewnątrz polecenia wywoływanego przez pakiet exec (za pomocą $ BUNDLE_BIN_PATH)
  • umieścić katalog conta wykonywalne ining (jak po szynach, rspec, rackup) dla wiązki o $ PATH
  • upewnić się, że jeśli Bundler jest wywoływany w podpowłoce, używa tego samego Gemfile (poprzez ustawienie BUNDLE_GEMFILE)
  • dodać -rbundler/ustawienie do $ RUBYOPT, który gwarantuje, że programy Ruby przywołane w podpowłoce można zobaczyć kamienie w wiązce

Więc jeśli budować swoją aplikację z obsługą Bundler w umyśle, a potem nigdy nie trzeba bundle exec swoją aplikację.

Ale jeśli trzeba użyć inne narzędzia, które ładują swój kod aplikacji, które mogą załadować perełki przed oni załadować swój kod aplikacji (który to może ciągnąć się w niewłaściwym bez dołączonego GEM), następnie trzeba użyć bundle exec.

+0

Świetna odpowiedź, dziękuję bardzo! –

Powiązane problemy