Czy powinienem zatwierdzać pliki yarn.lock i package-lock.json?

Odpowiedzi:

149

Generalnie zawsze zatwierdzaj pliki blokady zależności

Jak objęte gdzie indziej, pliki lock zależność, które są obsługiwane przez wiele systemów zarządzania pakietami (np: kompozytor i Bundler ), powinna być zaangażowana w kodzie w wycofanych z łańcucha projektów - tak, że każdy próbuje uruchomić ten projekt robi więc z dokładnie przetestowanym zestawem zależności.

Mniej jasne jest, czy pliki blokujące powinny być zawsze zatwierdzane w pakietach, które mają być uwzględnione w innych projektach (gdzie pożądane są luźniejsze zależności). Jednak zarówno Yarn , jak i NPM (omówione przez @Cyrille) inteligentnie ignorują yarn.locki package-lock.jsonodpowiednio w razie potrzeby, dzięki czemu bezpieczne jest zawsze zatwierdzanie tych plików blokujących.

Dlatego zawszeyarn.lockpackage-lock.json powinieneś zatwierdzić przynajmniej jeden menedżer pakietów lub w zależności od tego, którego używasz.

Czy powinieneś zatwierdzić zarówno yarn.lock, jak i package-lock.json?

Obecnie mamy dwa różne systemy zarządzania pakietami, które zarówno zainstalować ten sam zestaw zależności od package.json, ale które generują i odczytywanych z dwóch różnych plików blokujących. NPM 5 generuje package-lock.json, podczas gdy Yarn generuje yarn.lock.

Jeśli zatwierdzisz package-lock.json, budujesz wsparcie dla osób instalujących twoje zależności z NPM 5. Jeśli zatwierdzisz yarn.lock, budujesz wsparcie dla osób instalujących zależności z Yarn.

To, czy zdecydujesz się zatwierdzić, yarn.lockczy package-lock.jsonoba, zależy od tego, czy osoby rozwijające się w Twoim projekcie używają tylko Yarn lub NPM 5, czy też obu. Jeśli twój projekt jest open source, prawdopodobnie najbardziej przyjazną dla społeczności rzeczą byłoby zatwierdzenie obu i zautomatyzowany proces, aby zapewnić yarn.locki package-lock.jsonzawsze pozostać zsynchronizowany.

Aktualizacja: Nitki są teraz wprowadzane jest importpolecenie , które będzie generować yarn.lockplik z package-lock.jsonpliku. Może to być przydatne do utrzymywania synchronizacji dwóch plików. (Dzięki @ słabe)


Kwestia ta została szczegółowo omówiona w projekcie Yarn w:

Obie są teraz zamknięte.

Robin Winslow
źródło
1
Świetna odpowiedź. Jednak odnosząc się do twojego punktu: „Najbezpieczniejszą rzeczą do zrobienia byłoby wygenerowanie i zatwierdzenie ich obu za każdym razem, gdy zmieniają się twoje zależności”. Nie jestem pewien, dlaczego byłoby to „najbezpieczniejsze”. Jak wspomniałeś, jest bardzo prawdopodobne, że „dwa pliki mogą stracić synchronizację”. Odpowiedź @ crimbo wyjaśnia ten problem bardziej szczegółowo.
TachyonVortex
Myślę, że to może być różnica w tym, czy możesz kontrolować wszystkich ludzi, którzy prowadzą Twój projekt. Jeśli jesteś właścicielem zespołu, z pewnością wybierz standard Yarn i użyj yarn.lock. Ale jeśli jest to projekt open source (jak wszystkie nasze), ludzie mogą używać NPM w twoich projektach, nawet jeśli używasz Yarn wewnętrznie. Zatem idealnym najbezpieczniejszym rozwiązaniem byłoby użycie zautomatyzowanego systemu, który zapewni synchronizację zarówno yarn.lock, jak i package-lock.json. Wywieraj także nacisk na Yarn, aby przełączył się na package-lock.json.
Robin Winslow
1
yarn importzostał wprowadzony w 2018 r. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
słaby
18

Powinieneś zatwierdzić 1 plik blokady drzewa zależności, ale nie powinieneś zatwierdzać obu. Wymaga to również standaryzacji na przędzy lub npm (nie na obu), aby zbudować + opracować projekt za pomocą.

Oto artykuł o przędzy, który wyjaśnia, dlaczego należy zatwierdzić yarn.lock, jeśli wprowadzisz standaryzację na przędzy.

Jeśli zatwierdzisz oba yarn.lockpliki ORAZ package-lock.jsonpliki, istnieje wiele sposobów, w jakie te 2 pliki mogą zapewnić różne drzewa zależności (nawet jeśli algorytmy rozdzielczości drzew yarn i npm są identyczne), i nietrywialne jest zapewnienie, że zapewniają dokładnie takie same ta sama odpowiedź. Ponieważ jest to nietrywialne, jest mało prawdopodobne, że to samo drzewo zależności zostanie utrzymane w obu plikach i nie chcesz innego zachowania w zależności od tego, czy kompilacja została wykonana przy użyciu yarn, czy npm.

Jeśli i kiedy przędza przełączy się z używania yarn.lockna package-lock.json( problem tutaj ), wybór pliku blokady do zatwierdzenia stanie się łatwy i nie będziemy już musieli martwić się o przędzę i npm skutkujące różnymi kompilacjami. Opierając się na tym wpisie na blogu , jest to zmiana, której nie powinniśmy się wkrótce spodziewać (wpis na blogu opisuje również różnice między yarn.locki package-lock.json.

crimbo
źródło
11

Myślałem o tym samym pytaniu. Oto moje myśli, mam nadzieję, że to pomoże:

Dokumentacja npm package-lock.json zawiera następujące informacje:

Package-lock.json jest generowany automatycznie dla wszystkich operacji, w których npm modyfikuje drzewo node_modules lub package.json. Opisuje dokładnie drzewo, które zostało wygenerowane, tak aby kolejne instalacje były w stanie wygenerować identyczne drzewa, niezależnie od pośrednich aktualizacji zależności.

Jest to świetne, ponieważ zapobiega efektowi „działa na moim komputerze”.

Bez tego pliku, jeśli ty npm install --save A, npm doda "A": "^1.2.3"do twojego package.json. Kiedy ktoś pracuje npm installnad projektem, możliwe jest, że wersja 1.2.4z Azostał zwolniony. Ponieważ jest to najnowsza dostępna wersja, która spełnia zakres semver określony w Twoim package.json, zainstaluje tę wersję. Ale co, jeśli w tej wersji pojawi się nowy błąd? Ta osoba będzie miała problem, którego nie możesz odtworzyć, ponieważ masz poprzednią wersję, bez żadnego błędu.

Naprawiając stan node_moduleskatalogu, package-lock.jsonplik zapobiega temu problemowi, ponieważ każdy będzie miał te same wersje wszystkich pakietów.

Ale co, jeśli piszesz i publikujesz moduł npm? Dokumentacja mówi, co następuje:

Jednym z kluczowych szczegółów dotyczących pakietu package-lock.json jest to, że nie można go opublikować i zostanie zignorowany, jeśli zostanie znaleziony w jakimkolwiek miejscu innym niż pakiet najwyższego poziomu.

Tak więc, nawet jeśli to zatwierdzisz, kiedy użytkownik zainstaluje twój moduł, nie otrzyma package-lock.jsonpliku, a jedynie package.jsonplik. Dlatego npm zainstaluje najnowszą wersję, która spełnia zakresy semver wszystkich zależności. Oznacza to, że zawsze chcesz przetestować swój moduł z tymi wersjami swoich zależności, a nie z tą, którą zainstalowałeś, kiedy zacząłeś pisać moduł. Więc w tym przypadku package-lock.jsonjest wyraźnie bezużyteczny. Co więcej, może to być denerwujące.

Cyrille
źródło
7

Oto moja praktyczna zasada: jeśli pracujesz nad aplikacją, zatwierdź plik (i) blokady. Jeśli utrzymujesz bibliotekę, dodaj ją do listy ignorowanych. Tak czy inaczej, powinieneś używać dokładnych zakresów semver w package.json. Yehuda Katz (w pamięci podręcznej ) napisał świetne wyjaśnienie, kiedy zatwierdzać Gemfile.lock(plik blokady Rubiego), a kiedy nie. Przeczytaj przynajmniej sekcję tl; dr.

ravinggenius
źródło
Link jest uszkodzony.
Juha Syrjälä
Dzięki @ JuhaSyrjälä. Dodałem drugi link do artykułu.
ravinggenius
Gdzie jest lista ignorowanych dla npm lub przędzy?
neves
„Lista ignorowanych” będzie specyficzna dla repozytorium źródłowego twojego projektu (git, mercurial, Subversion). W przypadku git plik jest wywoływany .gitignorei zazwyczaj znajduje się w katalogu głównym projektu.
ravinggenius
4

Masz rację! Zezwolenie na używanie obu npmi yarnspowoduje problemy. Spójrz na ten artykuł .

Obecnie planujemy dodać ostrzeżenia do użytkowników, którzy używają obu yarn i npmw tym samym repozytorium do instalowania pakietów.

Zdecydowanie zalecamy usunięcie package-lock.jsonpliku, jeśli zdecydujesz się użyć przędzy, aby uniknąć przyszłych nieporozumień i możliwych problemów ze spójnością.

Możesz nie chcieć npmi yarnjako menedżer pakietów.

BinaryJoe01
źródło
2

Te pliki są zarządzane przez twoje narzędzia, więc - zakładając, że użycie przędzy skutecznie zaktualizuje package-lock.json- przypuszczam, że zatwierdzenie obu plików działa dobrze.

Myślę, że najważniejszy dla twojego użytkownika jest package-lock.json(na przykład nie używam włóczki), więc ten musi być zaangażowany.

Albowiem yarn.lock, to zależy, jeśli pracować samodzielnie lub w zespole. Jeśli solo, to chyba nie ma potrzeby tego robić. Jeśli (planujesz) pracować w zespole, to prawdopodobnie powinieneś to robić , przynajmniej do czasu, gdy przędza to wspiera

Przypuszczam, że zespół przędzy w końcu przestanie używać yarn.locki używać package-json.lockzamiast tego, w tym momencie stanie się prostszy 😛

dohzya
źródło
1
Nie przestali używać yarn.lock.
jayarjo
0

Nie, jednoczesne używanie obu plików blokujących najczęściej powoduje niespójności w drzewie zależności, zwłaszcza podczas współpracy w zespole. Ignorowanie jednej lub drugiej blokady to proste rozwiązanie. Upewnij się tylko, że Twój zespół rozumie i zgadza się z tą zmianą.

AndrewSteinheiser
źródło