Zostały one opracowane przez różne zespoły w różnym czasie i są używane przez różne oprogramowanie.
Lista wersji ruby w Gemfile to feature in bundler.
Ponieważ Gemfile jest w większości używany tylko przez bundler, będzie on działał głównie tylko wtedy, gdy uruchomisz pakiet bundler - używając bundle exec
lub oprogramowania (takiego jak Rails), które automatycznie wyzwala dla ciebie bundler. Jego efektem jest po prostu błąd i odmowa uruchomienia, jeśli nie używasz określonej wersji ruby. Jest to wymaganie - uruchomione pod tym rubinem, albo zgłoszę błąd, ostrzegając cię, że biegasz pod niewłaściwym rubinem.
Jednak, heroku also pays attention do wersji określonej w Gemfile, i będzie działać pod tą wersją. Heroku zdecydował się również użyć tej funkcji w pakiecie Bundler. Ale większość innych programów na twojej stacji roboczej, a nawet travis, nie używa tej konwencji. (Travis zmodyfikuje twój .travis.yml ENV, aby określić wersję ruby do użycia).
Funkcja w Bundler został wprowadzony w Bundler 1,2 w sierpniu 2012.
Plik .ruby-version został po raz pierwszy wprowadzony przez rvm, pierwszego kierownika wersji Ruby. Jeśli używasz rvm i przełączysz się na katalog projektu z plikiem .ruby-version
, rvm automatycznie przełączy twoją powłokę na określoną wersję ruby.
Nie jestem pewien, kiedy rvm wprowadził tę funkcję, ale myślę, że przed funkcją "ruby" Gemfile.
Od rvm wprowadzono go, inne oprogramowanie do zmiany wersji ruby, takie jak rbenv i chruby, przyjęło to również, aby zrobić to samo - automatycznie przełącza się na wersję ruby podaną, gdy wpisujesz do katalogu cd
. Chociaż myślę, że z rbenv i chruby oba mogą być opcjonalne.
Były to różne funkcje wprowadzane i wspierane przez różne pakiety oprogramowania w różnym czasie, robiąc nieco inne rzeczy.
Zgadzam się, że byłoby denerwujące utrzymanie obu tych elementów i zapewnienie ich synchronizacji.
Oba są rzeczywiście opcjonalne, nie trzeba ich używać. Tyle tylko, że możesz potrzebować rubokletu Gemfile dla heroku, aby powiedzieć, który rubin chcesz uruchomić.
Ja osobiście nie używam. Ale jeśli potrzebujesz pracować w różnych wersjach ruby w różnych projektach i możesz mieć pewność, że twój menedżer wersji ruby (rvm, rbenv lub chruby) automatycznie przełączy się na właściwą dla danego projektu wersję ruby, może być przydatna .ruby-version
.
Z wyjątkiem celów heroku, umieszczenie ruby w Gemfile jest po prostu po to, aby nie popełnić błędu, na przykład przy wdrażaniu. A może wewnętrzne zautomatyzowane wdrażanie lub środowisko CI mogłoby z nich korzystać podobnie jak w przypadku heroku, a może inne stosy rozmieszczenia w chmurze lub go adoptowały. Wydaje mi się, że wielu uznało, że nie jest to zbyt użyteczne - tego też nie będę używał, dopóki nie napotkasz problemu, który rozwiązuje. Jedną z niedogodności, jakie niektórzy mają z wersjami rubinowymi w Gemfile, jest to, że z nowymi rubinami zawsze wychodzącymi, musisz ciągle aktualizować wszystkie swoje Gemfile.
Ogólnie rzecz biorąc, ostatnie kilka lat wydania ruby było bardzo kompatybilne wstecz, ograniczając potrzebę upewnienia się, że używasz dokładnej wersji ruby, najnowszy kod będzie działał na najnowszym ruby, nawet jeśli został pierwotnie napisany dla starszego.
Nie wierzę w żadną z tych funkcji, ponieważ pozwala określić zakres wersji rubinowych, np.
Korzystając z obu tych funkcji, używaj ich tylko wtedy, gdy ich potrzebujesz lub uważasz za użyteczne, nie musisz ich używać, i dobrze (jeśli denerwujesz się) używać obu, jeśli potrzebujesz tego, co robisz.
Ponieważ Gemfile jest żywym kodem ruby, teoretycznie możesz mieć swój Gemfile odczytać plik .ruby-version
i automatycznie użyć tej wartości jako wartości Gemfile ruby
. Jeśli chcesz użyć obu i "nie powtarzaj się" z tym. Nie wiem, czy to normalne, po prostu o tym pomyślałem. Ale powinno działać dobrze.
myślę, że nie ma potrzeby, aby określić wersję rubinowy w Gemfile w ogóle . –
Afaik '.ruby-version' ustawia wersję Ruby dla RVM lub rbenv, ale Heroku na przykład pobiera wersję Ruby z Gemfile ([źródło] (https://devcenter.heroku.com/articles/ruby-versions)) . – spickermann
Dzięki @spickermann, brzmi to jak dobry pomysł, aby mieć oba. – Todd