Jak zainstalować zależności package.json w bieżącym katalogu przy użyciu npm

202

Mam aplikację internetową: fooapp . Mam package.jsonw katalogu głównym. Chcę zainstalować wszystkie zależności w określonym node_modules directory. Jak mam to zrobic?

Czego chcę

Powiedzmy, że mam dwie widgetzależności. Chcę skończyć z taką strukturą katalogów:

node_modules/
  widgetA
  widgetB
fooapp/
  package.js
  lib
  ..

Co dostaję

kiedy biegam npm install fooapp/ , dostaję to:

node_modules/
  fooapp/
    node_modules/
      widgetA
      widgetB
    package.js
    lib/
    ..
fooapp/
  package.js
  lib/
  ..

npm tworzy kopię mojego katalogu aplikacji w katalogu node_modules i instaluje pakiety w innym katalogu node_modules.

Rozumiem, że ma to sens przy instalowaniu pakietu. Ale require()mojej aplikacji internetowej nie ma w czymś innym, uruchamiam ją bezpośrednio. Szukam prostego sposobu zainstalowania moich zależności w określonym katalogu node_modules.

Daniel Beardsley
źródło

Odpowiedzi:

389

Bieganie:

npm install

z katalogu aplikacji (tj. gdzie znajduje się pakiet.json) zainstaluje zależności dla twojej aplikacji, zamiast instalować ją jako moduł, jak opisano tutaj . Zostaną one umieszczone w ./node_modules w stosunku do pliku package.json (w rzeczywistości jest nieco bardziej skomplikowany niż ten, więc sprawdź tutaj npm docs ).

Jeśli chcesz, możesz przenieść katalog node_modules do katalogu nadrzędnego swojej aplikacji, ponieważ mechanizm „wymagania” węzła to rozumie. Jeśli jednak chcesz zaktualizować zależności aplikacji podczas instalacji / aktualizacji, npm nie zobaczy przeniesionego „modułu_węzła” i zamiast tego utworzy nowy katalog, ponownie w stosunku do pliku package.json.

Aby temu zapobiec, po prostu utwórz dowiązanie symboliczne do przeniesionego modułu_węzła z katalogu aplikacji:

ln -s ../node_modules node_modules
ireddick
źródło
Fantastyczny! Wypróbuję to i oznaczę tę odpowiedź jako zaakceptowaną, jeśli zadziała.
Daniel Beardsley,
9
Mimo że jest to działające rozwiązanie, okazało się, że npm linkjest wygodniejsze w sytuacjach, w których musisz pobrać moduły z innego katalogu (patrz stackoverflow.com/a/14387210/820520 )
melekes
14

W moim przypadku muszę to zrobić

sudo npm install  

mój projekt znajduje się w / var / www, więc muszę również ustawić odpowiednie uprawnienia.

aesede
źródło
15
sudo może nie być wymagane do instalacji npm.
Allen Koo
2
W zależności od użytkownika, który musi wykonać plik js i zainstalowanych zależności, możesz uruchomić sudo -u [username] npm install. Lepiej po prostu npm installi chownkatalog node_modules rekurencyjnie po fakcie.
TheLonelyGhost
5
nigdy nie uruchamiaj npm z sudo, chyba że używasz -g- i nawet wtedy są lepsze sposoby, aby sobie z tym poradzić.
tkone
1
Dzięki za odpowiedź, ale dlaczego? możesz wytłumaczyć? Mam na myśli, co jeśli mam projekt, w którym chcę lub muszę zachować folder z uprawnieniami administratora i zainstalować zależności bez opcji -g? może jest dobry powód, ale kilka razy zainstalowałem sudo npm (bez -g) i nigdy nie miałem żadnych problemów. Twoje zdrowie!
aesede
1
@RredCat Zgadzam się z właściwym sposobem robienia tego rodzaju rzeczy, ale po pewnym czasie zauważyłem, że ta dyskusja migruje w kierunku Ubuntu, wydaje się, że jest problem w sposobie zarządzania niektórymi uprawnieniami i folderami, który zmusza użytkowników do korzystania sudo npm. Ponownie, tylko w Ubuntu.
aesede
0

Po prostu wykonaj

sudo npm i --save

To wszystko

HA
źródło