Używamy przędzy dla wszystkich naszych deterministycznych instalacji pkg, ale nie uniemożliwiamy użytkownikowi korzystania z npm - zgaduję, że posiadanie obu tych plików spowoduje jednak problemy. Czy należy go dodać do Twojego katalogu .gitignore?
119
Odpowiedzi:
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.lock
ipackage-lock.json
odpowiednio w razie potrzeby, dzięki czemu bezpieczne jest zawsze zatwierdzanie tych plików blokujących.Dlatego zawsze
yarn.lock
package-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 generujepackage-lock.json
, podczas gdy Yarn generujeyarn.lock
.Jeśli zatwierdzisz
package-lock.json
, budujesz wsparcie dla osób instalujących twoje zależności z NPM 5. Jeśli zatwierdziszyarn.lock
, budujesz wsparcie dla osób instalujących zależności z Yarn.To, czy zdecydujesz się zatwierdzić,
yarn.lock
czypackage-lock.json
oba, 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.lock
ipackage-lock.json
zawsze pozostać zsynchronizowany.Aktualizacja: Nitki są teraz wprowadzane jest
import
polecenie , które będzie generowaćyarn.lock
plik zpackage-lock.json
pliku. 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.
źródło
yarn import
został wprowadzony w 2018 r. yarnpkg.com/blog/2018/06/04/yarn-import-package-lockPowinieneś 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.lock
pliki ORAZpackage-lock.json
pliki, 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.lock
napackage-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ędzyyarn.lock
ipackage-lock.json
.źródło
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:
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 twojegopackage.json
. Kiedy ktoś pracujenpm install
nad projektem, możliwe jest, że wersja1.2.4
zA
został zwolniony. Ponieważ jest to najnowsza dostępna wersja, która spełnia zakres semver określony w Twoimpackage.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_modules
katalogu,package-lock.json
plik 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:
Tak więc, nawet jeśli to zatwierdzisz, kiedy użytkownik zainstaluje twój moduł, nie otrzyma
package-lock.json
pliku, a jedyniepackage.json
plik. 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 przypadkupackage-lock.json
jest wyraźnie bezużyteczny. Co więcej, może to być denerwujące.źródło
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.źródło
.gitignore
i zazwyczaj znajduje się w katalogu głównym projektu.Masz rację! Zezwolenie na używanie obu
npm
iyarn
spowoduje problemy. Spójrz na ten artykuł .Możesz nie chcieć
npm
iyarn
jako menedżer pakietów.źródło
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 wspieraPrzypuszczam, że zespół przędzy w końcu przestanie używać
yarn.lock
i używaćpackage-json.lock
zamiast tego, w tym momencie stanie się prostszy 😛źródło
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ą.
źródło