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?
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?
Odpowiedzi:
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
i package-lock.json
odpowiednio w razie potrzeby, dzięki czemu bezpieczne jest zawsze zatwierdzanie tych plików blokujących.
Dlatego zawszeyarn.lock
package-lock.json
powinieneś zatwierdzić przynajmniej jeden menedżer pakietów lub w zależności od tego, którego używasz.
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.lock
czy package-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
i package-lock.json
zawsze pozostać zsynchronizowany.
Aktualizacja: Nitki są teraz wprowadzane jest import
polecenie , które będzie generować yarn.lock
plik z package-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.
yarn import
został wprowadzony w 2018 r. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
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ą.
Jeśli zatwierdzisz oba yarn.lock
pliki ORAZ package-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
na 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.lock
i package-lock.json
.
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 install
nad projektem, możliwe jest, że wersja 1.2.4
z A
został 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_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:
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.json
pliku, a jedynie package.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 przypadku package-lock.json
jest wyraźnie bezużyteczny. Co więcej, może to być denerwujące.
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.
.gitignore
i zazwyczaj znajduje się w katalogu głównym projektu.
Masz rację! Zezwolenie na używanie obu npm
i yarn
spowoduje problemy. Spójrz na ten artykuł .
Obecnie planujemy dodać ostrzeżenia do użytkowników, którzy używają obu
yarn
inpm
w tym samym repozytorium do instalowania pakietów.Zdecydowanie zalecamy usunięcie
package-lock.json
pliku, 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ć npm
i yarn
jako menedżer pakietów.
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.lock
i używać package-json.lock
zamiast tego, w tym momencie stanie się prostszy 😛
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ą.