2015-10-05 7 views
5

Używam Ruby 2.1 i Rails 4.1 na Windows 7. Ilekroć uruchamiam bundle install, wszystkie klejnoty są instalowane w ścieżce systemowej c:/Ruby21/lib/ruby/gems/2.1.0/gems/. Znalazłem także katalog vendor w moim projekcie.Czy należy instalować klejnoty ruby ​​w repozytorium systemowym (globalnie) lub dostawcy/pakiecie projektu (lokalnie)?

Jadąc z PHP composer i node.js npm tle, wszystkie zależności powinny być zainstalowane lokalnie w folderze projektu vendor lub node_modules folderu. Moje pytania to:

  1. Czy należy instalować klejnoty w ścieżce systemowej lub vendor/bundle?
  2. Jeśli w ścieżce systemowej powinny być zainstalowane wszystkie klejnoty lub niektóre klejnoty, w jaki sposób może wpłynąć na środowisko produkcyjne, w którym nie mam dostępu do powłoki?
  3. Czy wszystkie klejnoty lub określone klejnoty powinny być zainstalowane w vendor/bundle?
  4. Jak zainstalować klejnoty w wersji vendor/bundle?

Odpowiedz

6

Po uruchomieniu bundle install używa się narzędzia o nazwie Bundler.

  1. Bundler zajmuje zarządzania zależnościami w podobny sposób jak Composer, ale zamiast instalować wszystko w folderze projektu, instaluje w całym systemie twoje klejnoty, które są dzielone pomiędzy wszystkich swoich projektach. Śledzi, który projekt wymaga jakich bibliotek, używając Gemfile w folderze projektu. Powinieneś po prostu pozwolić, żeby Bundler zrobił coś takiego, robi to bardzo dobrze i jest standardowym menedżerem pakietów dla Rails.

  2. Jeśli twój host obsługuje aplikacje Ruby i Rails (na przykład PaaS jak Heroku), to na pewno będzie wesprzeć Bundler i wszystkie niezbędne klejnoty zostaną zainstalowane. Jeśli mówimy o tanim współdzielonym hostingu bez dostępu do powłoki, to i tak nie będziesz w stanie wdrożyć aplikacji Ruby, ponieważ będziesz musiał zainstalować rzeczywistego interpretera Ruby i inne rzeczy, które wymagałyby dostępu do powłoki.

  3. nr

  4. nie należy. Jest this article opisujące, jak to zrobić, ale wydaje mi się, że

    niezliczoną ilość razy, gdzie instalowanie perełki globalnie wyciekły do ​​innych projektów na tym samym komputerze, co doprowadziło do dziwne zachowanie, które było denerwujące do debugowania

    zdarzyło się tylko autorowi tego artykułu i nie sądzę, żeby to Winler był winny. W każdym razie zawsze powinieneś poprzedzać polecenia gem przy pomocy bundle exec (jak w bundle exec rspec) i nigdy nie będziesz mieć wspomnianego problemu. bundle exec upewnia się, że po uruchomieniu polecenia z gem, określona jest poprawna wersja zdefiniowana w Gemfile, ważne jest, jeśli masz kilka wersji tego samego klejnotu zainstalowanego w twoim systemie.

Kilka lat temu, gdy RVM był popularny, gemsets osiągnąć podobny cel, ale dostałem w większości przestarzałe przez rbenv i Bundler.

+3

Myślę, że jest nieco źle skomunikowane, że 'bundle exec' jest wymagany i dlaczego jest wymagany, dlatego ludzie zwykle myślą, że zależności powinny być zainstalowane w folderze projektu. Również większość innych menedżerów pakietów (kompozytor, npm, altana itd.) Robi to, więc różne wspólne wzorce mogą być również mylące. –

+0

Nie rozumiem o tym, że "w poleceniu zawsze powinieneś stosować komendy gem z' bundle exec' ". – Sithu

+0

@Sithu zobacz [to pytanie i odpowiedź] (http://stackoverflow.com/questions/6588674/what-does-bundle-exec-rake-mean). W skrócie, upewnia się, że po wykonaniu polecenia pochodzącego z gem, wywoływana jest poprawna wersja zdefiniowana w Gemfile. Jest ważne, jeśli masz kilka wersji tego samego klejnotu zainstalowanego w systemie. Z reguły za każdym razem, gdy wykonujesz polecenie w kontekście twojego projektu, powinieneś poprzedzać go 'bundle exec'. – p4sh4

Powiązane problemy