Jestem początkującym w Ruby on Rails i używam Rails 3.0.9.
Jaka jest różnica między Gemfile
iw Gemfile.lock
Railsach?
źródło
Jestem początkującym w Ruby on Rails i używam Rails 3.0.9.
Jaka jest różnica między Gemfile
iw Gemfile.lock
Railsach?
To miejsce, w Gemfile
którym określasz, których klejnotów chcesz użyć, i pozwala określić, które wersje.
Gemfile.lock
Plik jest gdzie Bundler rejestruje dokładne wersje, które zostały zainstalowane. W ten sposób, gdy ta sama biblioteka / projekt jest ładowana na innym komputerze, uruchomienie bundle install
obejrzy Gemfile.lock
i zainstaluje dokładnie te same wersje, zamiast używać Gemfile
i instalować najnowsze wersje. (Uruchamianie różnych wersji na różnych komputerach może prowadzić do zepsutych testów itp.) Nigdy nie powinieneś musieć bezpośrednio edytować pliku blokady.
Zapoznaj się z celem i uzasadnieniem programu Bundler , w szczególności w sekcji Sprawdzanie kodu w kontroli wersji.
Gemfile.lock
zawiera wersje „otwarte” w niektórych przypadkach (np.rails (4.0.0)
Wymagabundler (>= 1.3.0, < 2.0)
), co powoduje problemy. Masz pomysł, jak uniknąć tych „otwartych” zależności?Zazwyczaj zależności w Gemfile piszemy jako:
Tutaj w zasadzie mówisz: „ Chcę nokogiri, o ile jest nowszy niż wersja 1.4.4 ”, itd. Teraz przypuśćmy, że skonfigurowałem
Gemfile
8 miesięcy temu i pomyślnie skonfigurowałem moją aplikację z tym wymaganiem. 8 miesięcy temu wersja nokogiri była 1.4.4 . Moje aplikacje rails działały doskonale bez żadnych problemów w tej wersji.Teraz pomyśl, że próbuję zbudować to samo
Gemfile
. Ale jeśli spojrzymy na wersje nokogiri , zobaczymy, że obecna stabilna wersja zmieniła się na 1.4.9 . Oznacza to, że jeśli spróbujemy zbudować, bundler zainstaluje wersję 1.4.9 nokogiri (załóżmy, że nie mamyGemfile.lock
).Co to znaczy ?
Jak widać, jeśli ich nie masz
Gemfile.lock
i uruchom:wtedy aktualnie używane klejnoty mogą być inne w dowolnym momencie . Twoja aplikacja korzystała z wersji 1.4.4 i 8 miesięcy temu działa bez żadnych problemów, ale jeśli spróbujesz ją teraz zbudować , otrzymasz wersję 1.4.9 . Może jest zepsuty w najnowszej wersji
nokogiri
, niesamowitej funkcji, której użyłeś w 1.4.4 nie jest bardziej dostępna itp.Aby zapobiec tego rodzaju problemom,
Gemfile.lock
stosuje się. WGemfile.lock
tylko dokładne wersje są napisane i dlatego tylko te zostaną zainstalowane. Oznacza to, że jeśli rozpowszechniasz swoją aplikację za pomocąGemfile.lock
, na każdym komputerze będą zainstalowane te same perełki, a co najważniejsze , wszystkie otrzymają tę samą wersję . Zapewni to stabilny i wspólny stos wdrożeniowy.Jak powstaje Gemfile.lock?
Jest tworzony automatycznie z pierwszym:
Komenda. Po tym za każdym razem, gdy uruchomisz
bundle install
, pakiet najpierw wyszukaGemfile.lock
i zainstaluje określone tam klejnoty. Dystrybucja tego pliku między projektami jest nawykiem, aby zapewnić spójność i stabilność.Jak zaktualizować Gemfile.lock?
Jeśli jesteś zadowolony z najnowszej wersji swoich aplikacji, możesz zaktualizować
Gemfile.lock
. Po prostu odzwierciedl swoje zmiany wGemfile
. Oznacza to zmianę zależności na nowe dokładne wersje wGemfile
. Po tym biegu:Spowoduje to zaktualizowanie Cię
Gemfile.lock
o najnowszą wersję aplikacji.źródło
nokogiri ~> 1.4.4
nie pozwoliłby1.5.3
na instalację; max dozwolone byłoby1.4.x
gdziex>=4
(w przypadku nokogiri byłoby to1.4.7
). Te~>
środki operatorskie tylko ostatnia cyfra w używanych gem może być „większy niż” danej wersji. Np.foo ~> a.b.c.d
Oznacza , że każda wersjafoo
jest w porządku, o ile nadal jest abc {coś} gdzie {coś}>=
d. Zobacz też powiązane pytaniegem "nokogiri", "~> 1.4.4"
wprawia w zakłopotanie, to fakt, że już określasz konkretne wersje, używając w pliku gem. Dlaczego pakiet nie mógł po prostu użyć tej wersji? Czy to dlatego, że jest przeznaczony do domyślnego celowego instalowania najnowszych wersji klejnotu?~> 1.4.4
jest odpowiednikiem>= 1.4.4 and < 1.5
. Zobacz bundler.io/v1.5/gemfile.html . Aby uzyskać dokładną wersję, po prostu użyjgem 'foo', '1.4.4'
.bundle install
będzie sprawdzać,Gemfile
nawet jeśli istniejeGemfile.lock
i wymusi nowe ograniczeniaGemfile.lock
?Gemfile.lock
Kiedy uruchomisz instalację pakietową, Bundler zachowa pełne nazwy i wersje wszystkich klejnotów, których użyłeś (w tym zależności klejnotów określonych w Gemfile (5)) w pliku o nazwie Gemfile.lock.
Bundler używa tego pliku we wszystkich kolejnych wywołaniach instalacji pakietowej, co gwarantuje, że zawsze używasz tego samego dokładnego kodu, nawet gdy aplikacja jest przenoszona między maszynami.
Ze względu na sposób działania rozwiązywania zależności, nawet pozornie niewielka zmiana (na przykład aktualizacja do punktowego wydania zależności klejnotu w pliku Gemfile (5)) może spowodować, że do spełnienia wszystkich zależności potrzebne będą radykalnie różne klejnoty.
W rezultacie POWINIENEŚ sprawdzić swój plik Gemfile.lock w kontroli wersji. Jeśli tego nie zrobisz, każda maszyna, która sprawdzi Twoje repozytorium (w tym serwer produkcyjny), ponownie rozwiąże wszystkie zależności, co spowoduje użycie różnych wersji kodu stron trzecich, jeśli którykolwiek z klejnotów w Gemfile (5) lub którykolwiek ich zależności zostały zaktualizowane.
źródło