Zastanawiam się, czy powinniśmy śledzić node_modules w naszym repozytorium, czy przeprowadzać instalację npm podczas sprawdzania kodu?
git
node.js
version-control
npm
Tolga E.
źródło
źródło
Odpowiedzi:
Odpowiedź nie jest tak łatwa, jak sugeruje Alberto Zaccagni. Jeśli tworzysz aplikacje (zwłaszcza aplikacje korporacyjne), włączenie node_modules w repozytorium git jest opłacalnym wyborem, a wybór opcji zależy od projektu.
Ponieważ bardzo dobrze argumentował przeciwko node_modules, skoncentruję się na argumentach za nimi.
Wyobraź sobie, że właśnie skończyłeś aplikację korporacyjną i będziesz musiał ją wspierać przez 3-5 lat. Na pewno nie chcesz polegać na czyimś module npm, który może jutro zniknąć i nie możesz już aktualizować swojej aplikacji.
Lub masz swoje prywatne moduły, które nie są dostępne w Internecie i nie możesz zbudować aplikacji w Internecie. A może z jakiegoś powodu nie chcesz polegać na ostatecznej kompilacji w usłudze npm.
Możesz znaleźć wady i zalety w tym artykule Addy Osmani (chociaż dotyczy to Bower, jest to prawie taka sama sytuacja). Skończę cytatem ze strony domowej Bowera i artykułu Addy:
źródło
git checkout foo
. Jeśli node_modules nie są objęte VCS - przełączanie gałęzi jestgit checkout foo ; npm install
i cokolwiek twoja obecna wersja NPM wymaga do działania;)Szczegóły modułów są przechowywane
packages.json
, to wystarczy. Nie ma potrzeby meldowania sięnode_modules
.Ludzie używali
node_modules
kontroli wersji do blokowania zależności modułów, ale z powłoką npm, która nie jest już potrzebna.Kolejne uzasadnienie tego punktu, o czym @ChrisCM napisał w komentarzu:
źródło
Odradzałbym sprawdzanie w node_modules na przykład pakietów takich jak PhantomJS i node-sass, które instalują odpowiedni plik binarny dla bieżącego systemu.
Oznacza to, że jeśli jeden programista działa
npm install
w systemie Linux i sprawdza w node_modules - nie będzie działać dla innego dewelopera, który sklonuje repozytorium w systemie Windows.Lepiej jest sprawdzić w paczkach tar, które npm instalują pliki do pobrania i wskazać
npm-shrinkwrap.json
je. Możesz zautomatyzować ten proces za pomocą shrinkpack .źródło
npm install --global shrinkpack
samo w sobie nie ma odroczonej słabości, wymagając innych pakietów, z którymi następnie instalują skurczone pakiety? Jest to sprzeczne z radą Addy.shrinkpack
jest wymagana, aby następnie niezawodnie zainstalować zależności kompilacji. W związku z tym sama instalacja narzędzia kompilacji staje się słabością argumentu przeciwko poddawaniu wszystkich zależności kompilacji kontroli wersji.Widzę, że ten temat jest dość stary. Ale brakuje mi aktualizacji argumentów tutaj podanych z powodu zmienionej sytuacji w ekosystemie npm.
Zawsze radziłbym nie poddawać node_modules kontroli wersji. Prawie wszystkie korzyści z tego, wymienione w kontekście zaakceptowanej odpowiedzi, są obecnie dość nieaktualne.
Opublikowanych pakietów nie można już tak łatwo odwołać z rejestru npm. Nie musisz więc obawiać się utraty zależności, na których wcześniej polegał Twój projekt.
Umieszczenie pliku package-json.lock w VCS pomaga w przypadku często aktualizowanych zależności, które prawdopodobnie skutkują różnymi konfiguracjami, chociaż polegają na tym samym pliku package.json.
Tak więc umieszczenie node_modules w VCS w przypadku posiadania narzędzi do kompilacji offline może być uważane za jedyny dopuszczalny przypadek użycia. Jednak node_modules zwykle rośnie dość szybko. Każda aktualizacja zmieni wiele plików. A to wpływa na repozytoria na różne sposoby. Jeśli naprawdę weźmiesz pod uwagę długoterminowe skutki, to również może być przeszkodą.
Scentralizowane VCS, takie jak svn, wymagają przesyłania zatwierdzonych i wyewidencjonowanych plików przez sieć, co będzie piekielnie powolne, jeśli chodzi o wyewidencjonowywanie lub aktualizację folderu node_modules.
Jeśli chodzi o git, ta duża liczba dodatkowych plików spowoduje natychmiastowe zanieczyszczenie repozytorium. Należy pamiętać, że git nie śledzi różnic między wersjami żadnego pliku, ale przechowuje kopie dowolnej wersji pliku, gdy tylko zmieni się jeden znak. Każda aktualizacja dowolnej zależności spowoduje kolejny duży zestaw zmian. Twoje repozytorium git szybko się rozrośnie, ponieważ ma to wpływ na kopie zapasowe i zdalną synchronizację. Jeśli zdecydujesz się później usunąć node_modules z repozytorium git, nadal jest on jego częścią ze względów historycznych. Jeśli rozdzieliłeś swoje repozytorium git na jakiś zdalny serwer (np. W celu wykonania kopii zapasowej), wyczyszczenie go jest kolejnym bolesnym i podatnym na błędy zadaniem, z którym będziesz musiał się zmierzyć.
Tak więc, jeśli zależy Ci na wydajnych procesach i chcesz, aby rzeczy były „małe”, wolałbym raczej użyć oddzielnego repozytorium artefaktów, takiego jak Nexos Repository (lub po prostu jakiś serwer HTTP z archiwami ZIP), zapewniający wcześniej pobrany zestaw zależności do pobrania.
źródło
Brak śledzenia
node_modules
z kontrolą źródła jest właściwym wyborem, ponieważ niektóre moduły NodeJS, takie jak sterownik MongoDB NodeJS, używają dodatków NodeJS C ++. Te dodatki są kompilowane podczas uruchamianianpm install
polecenia. Więc kiedy śledzisznode_modules
katalog, możesz przypadkowo zatwierdzić plik binarny specyficzny dla systemu operacyjnego.źródło
Zgadzam się z ivoszz , że czasami warto sprawdzić folder node_modules, ale ...
scenariusz 1:
Jeden scenariusz: używasz pakietu, który zostanie usunięty z npm. Jeśli masz wszystkie moduły w folderze node_modules, nie będzie to dla ciebie problemem. Jeśli masz tylko nazwę pakietu w pliku package.json, nie możesz jej już pobrać. Jeśli paczka ma mniej niż 24 godziny, możesz ją łatwo usunąć z npm. Jeśli ma więcej niż 24 godziny, musisz się z nimi skontaktować. Ale:
Czytaj więcej
Więc szanse na to są niskie, ale jest scenariusz 2 ...
scenariusz 2:
Inny scenariusz, w którym ma to miejsce: Tworzysz wersję korporacyjną oprogramowania lub bardzo ważne oprogramowanie i piszesz w pliku package.json:
Używasz metody
function1(x)
tego pakietu.Teraz programiści studpid-package zmieniają nazwę metody
function1(x)
nafunction2(x)
i robią błąd ... Zmieniają wersję swojego pakietu z1.0.1
na1.1.0
. To problem, ponieważnpm install
następnym razem zaakceptujesz wersję,1.1.0
ponieważ użyłeś tyldy ("studpid-package": "~1.0.1"
).Dzwonienie
function1(x)
może teraz powodować błędy i problemy.Ale:
Wypchnięcie całego folderu node_modules (często ponad 100 MB) do repozytorium będzie kosztować miejsce w pamięci. Kilka KB (tylko package.json) w porównaniu z setkami MB (package.json i node_modules) ... Pomyśl o tym.
Możesz to zrobić / powinieneś o tym pomyśleć, jeśli:
oprogramowanie jest bardzo ważne.
kosztuje cię pieniądze, gdy coś się nie powiedzie.
nie ufasz rejestrowi npm. npm jest scentralizowany i teoretycznie może zostać zamknięty.
Nie musisz publikować folderu node_modules w 99,9% przypadków, jeśli:
tworzysz oprogramowanie tylko dla siebie.
zaprogramowałeś coś i po prostu chcesz opublikować wynik na GitHub, ponieważ ktoś może być tym zainteresowany.
Jeśli nie chcesz, aby node_modules znajdowały się w Twoim repozytorium, po prostu utwórz
.gitignore
plik i dodaj linięnode_modules
.źródło
npm install
w systemie Windows i MacOS może generować różne pliki (pliki zależne od systemu operacyjnego) w niektórych pakietach. Ale nie jestem tego pewien. Czy ktoś może zweryfikować, że to prawda?package-lock.json
. Jeśli w przyszłości wystąpi problem z aktualizacją pakietu studpid, możesz przywrócić plik blokady, aby znaleźć dokładną wersję, która działała dla Ciebie.Chciałbym zaoferować alternatywę środka drogi.
node_modules
do gita.package-lock.json
pliku, aby ustalić wersje zależności.W rzadkich przypadkach, gdy nie możesz uzyskać dostępu do NPM (lub innych rejestrów, z których korzystasz) lub określonego pakietu w NPM, masz kopię node_modules i możesz kontynuować pracę do czasu przywrócenia dostępu.
źródło
Jeszcze jedna rzecz do rozważenia: zameldowanie
node_modules
utrudnia / uniemożliwia skorzystanie z różnicy międzydependencies
idevDependencies
.Z drugiej strony jednak można by powiedzieć, że uspokajające jest wypchnięcie do produkcji dokładnie tego samego kodu, który przeszedł przez testy - włączając w to
devDependencies
.źródło
Nie jest wymagane wpisywanie modułów node_modules, jeśli zależności są wymienione w pliku package.json. Każdy inny programista może go po prostu uzyskać, wykonując instalację npm, a npm jest wystarczająco inteligentny, aby utworzyć node_modules w katalogu roboczym projektu.
źródło