2015-10-04 36 views
10

Mój ostatni projekt Railsowy jest mniej więcej i eksperymentuję z łamaniem wielu rzeczy i uczeniem się w tym procesie. Mam najnowszą wersję Ruby określony w moim gemfile:Czy źle jest ćwiczyć listę wersji Ruby w plikach Gemfile i .ruby-wersja Dotfile?

ruby '2.2.3'

I mam również .ruby-version dotfile w projekcie, z następującą zawartością:

2.2.3

innych niż oczywiste powielanie, co jest z tym nie tak? Jaki jest cel obu konwencji? Gdybym miał tylko jedną konwencję do umieszczenia mojej wersji Ruby, dlaczego miałbym mieć jedną (Gemfile) nad drugą (dotfile)?

Czy dobrze jest mieć obie konwencje w projekcie?

Mam zamiar być jedynym opiekunem tego projektu eksperymentalnego i nie uważam, że będzie to kwestia konieczności utrzymania tego jednego subtelnego powielania. Nie zamierzam ulepszać Rubiego dla tego projektu, a jeśli to zrobię, nie będę miał problemu z pamięcią, aby zrobić to w obu miejscach. Poza tym szczegółem, z pewnością uniknę takiego duplikowania w bazach kodów moich aplikacji.

+0

myślę, że nie ma potrzeby, aby określić wersję rubinowy w Gemfile w ogóle . –

+3

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

+0

Dzięki @spickermann, brzmi to jak dobry pomysł, aby mieć oba. – Todd

Odpowiedz

12

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.

+0

Dziękuję za dokładną odpowiedź. – Todd

+0

Mam również potencjalnie powiązane pytanie tutaj: http://stackoverflow.com/questions/34905560/is-it-a-bad-practice-to-have-a-rvmrc-and-a-ruby-version w projekcie -in-a-ruby, czy powinieneś zapewnić taką mądrość ponownie :) – Todd

6

Myślę, że lepiej unikać dwukrotnego podawania tych samych informacji, chyba że istnieją uzasadnione powody - tzn. Utrzymywać je w stanie suchym.

można zapisać wersję rubinowy „.ruby-wersja”, a następnie w Gemfile zrobić coś takiego:

ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp } 
+2

To jest tak suche, że marnieje. W każdym razie musisz ręcznie zmienić wersję w '.ruby-version', zastępując wiele instancji prostym z twoim ulubionym edytorem. – Dennis

+0

@Dennis to wszystko, o czym jest SUCHA. Ktoś może zapomnieć o zastąpieniu wyszukiwania. Ten kod mówi ci, że chcę używać tej samej wersji co w .ruby-version – PhilT

+2

To jest nieco bardziej zwięzła i równoważna: ruby ​​File.read ('. Ruby-version', mode: 'rb').chomp – Empact