2013-04-11 25 views
5

Zainstalowałem kilka pakietów węzłów i zauważyłem, że NPM tworzy grupę duplikatów.Wydaje się, że menedżer pakietów (NPM) wydaje zduplikowane pakiety.

Na przykład najpierw zainstalowałem mangustę, która oczywiście zainstalowała mnóstwo zależności. Następnie zainstalowałem pakiet mongodb, który również był wyposażony w bess jako zależność. Ze względu na nakładające się zależnościami, mam następujące nieprawidłowości:

MongoDB jest obecny w następujących katalogach:

/usr/local/lib/node_modules/mongodb/ 
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/ 

Również bson, zależność od MongoDB jest obecny w obu z nich:

/usr/local/lib/node_modules/mongodb/ 
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/ 

Zdaję sobie sprawę, że są to jedynie pliki kilobajtów, ale czuję się jak to może stworzyć wiele końca redundancji mógłbym skończyć z bardzo złożonego drzewa podobny do następującego:

/usr/local/lib/node_modules/[something1]/node_modules/[something2]/node_modules/[something3/.../.../node_modules/[somethingX]/ 

W tym scenariuszu określona [zależność] może występować na poziomach X w/usr/local/lib/node_modules.

Moja główna troska dotyczy aktualizacji tych modułów. Nie jest mi trudno wyobrazić sobie jednoczesne instalowanie modułów współbieżnych różnych wersji.

Czy nie byłoby łatwiej umieścić wszystko bezpośrednio w katalogu/usr/local/lib/node_modules /, a następnie powiązać zależności?

Odpowiedz

3

Problem polega na tym, że mangusta jest kodowana tylko do pracy z v1 mongodb i zakodowała twoją aplikację do pracy z v2 monondb - instaluje i ładuje obie wersje, więc wszystko działa. Możemy to zrobić w prosty sposób w węźle, ponieważ tryb modułu wymagającego nie zanieczyszcza globalnej przestrzeni nazw, w przeciwieństwie do przeglądarki - co sprawia, że ​​zarządzanie i uwzględnianie właściwych zależności jest królewskim bólem spowodowanym zanieczyszczeniem globalnej przestrzeni nazw.

Teraz, jeśli pakiet.json i pakiet.json mangusty zezwalają na tę samą wersję mongody (możesz określić konkretną wersję lub zakresy), to wykonanie rm -Rf node_modules; npm install spowoduje zainstalowanie tylko jednej kopii mongodb zamiast dwóch. Jednak, jak wspomniano wcześniej, jeśli podano wiele wersji, wiele wersji zostanie zainstalowanych i załadowanych.

+0

Czy to nie tworzy gorączkowej hierarchii po zainstalowaniu kilku różnych modułów i rozpoczęciu wielu różnych projektów? Czy istnieje sposób na przeprowadzenie aktualizacji cyklicznej za pomocą NPM? – zcserei

+0

Zapewniając ludziom kodowanie małych modułów, które pewnego dnia zostaną ukończone, zamiast dużych modułów, które zawsze będą się aktualizować, zostanie zainstalowana tylko jedna kopia modułu. Tak więc okazuje się, że nie jest to tak duży problem w rzeczywistości, ponieważ większość modułów węzła jest malutka, a jeśli nie, to przez jakiś czas słuchają gry zastępczej (James Halliday - http://substack.net/), oraz następnie przekonaj się do przyjęcia drobnej filozofii :) Jakiś czas temu zamieściłem kilka myśli na ten dokładny problem tutaj: https://gist.github.com/balupton/5308717 może to pomoże, zajęło mi wieki, aby przyjść do to również :) – balupton

+0

'jeśli [oba] ... pozwalają na tę samą wersję [] ... zainstalują tylko jedną kopię' Dlaczego to nie robi? Mam konkretny przypadek, w którym należy użyć tylko jednej kopii, ale kilka kopii jest instalowanych, a to zajmuje naprawdę dużo czasu, ponieważ ... nie jestem pewien dlaczego, ale każda instancja trwa dość długo, aby zainstalować! – Michael

Powiązane problemy