Как установить зависимости package.json в текущем каталоге с помощью npm

202

У меня есть веб-приложение: fooapp . У меня есть package.jsonв корне. Я хочу установить все зависимости в конкретном node_modules directory. Как мне это сделать?

Что я хочу

Допустим, у меня есть две widgetзависимости. Я хочу закончить со структурой каталогов, как это:

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

Что я получаю

когда я бегу, npm install fooapp/ я получаю это:

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

npm делает копию моего каталога приложения в каталоге node_modules и устанавливает пакеты в другой каталог node_modules.

Я понимаю, что это имеет смысл для установки пакета. Но я не делаю require()свое веб-приложение внутри чего-то другого, я запускаю его напрямую. Я ищу простой способ установить мои зависимости в определенный каталог node_modules.

Дэниэл Бердсли
источник

Ответы:

389

Бег:

npm install

изнутри каталога вашего приложения (то есть там, где расположен package.json) вы будете устанавливать зависимости для вашего приложения, а не устанавливать его как модуль, как описано здесь . Они будут помещены в ./node_modules относительно вашего файла package.json (на самом деле он немного сложнее, поэтому посмотрите документацию по npm здесь ).

Вы можете свободно перемещать каталог node_modules в родительский каталог вашего приложения, если хотите, потому что механизм 'require' узла понимает это. Однако, если вы хотите обновить зависимости вашего приложения с помощью install / update, npm не увидит перемещенные «node_modules» и вместо этого создаст новый каталог, опять-таки относительно package.json.

Чтобы предотвратить это, просто создайте символическую ссылку на перемещенные node_modules из директории вашего приложения:

ln -s ../node_modules node_modules
ireddick
источник
Фантастика! Я опробую его и отмечу этот ответ как принятый, если он работает.
Дэниэл Бердсли
9
Несмотря на то что это рабочий раствор, я узнал , что npm linkболее удобно в таких ситуациях , когда вам нужно захватить модули из другой директории (см stackoverflow.com/a/14387210/820520 )
Мелекесе
14

В моем случае мне нужно сделать

sudo npm install  

Мой проект находится внутри / var / www, поэтому мне также необходимо установить соответствующие разрешения.

aesede
источник
15
Возможно, sudo не требуется для установки npm.
Аллен Ку
2
В зависимости от пользователя, которому нужно выполнить файл js, и установленных зависимостей, вы можете запустить sudo -u [username] npm install. Лучше просто npm installи chownкаталог node_modules рекурсивно по факту.
TheLonelyGhost
5
никогда не запускайте npm с помощью sudo, если вы не используете -g- и даже тогда есть лучшие способы справиться с этим.
tkone
1
Спасибо за ответ, но почему? Вы можете объяснить? Я имею в виду, что если у меня есть проект, в котором я хочу или мне нужно сохранить папку с правами root и установить там зависимости без -g? возможно, есть веская причина, но я несколько раз делал sudo npm install (без -g) и никогда не получал никаких проблем. Ура!
aesede
1
@RredCat Я согласен о правильном способе выполнения такого рода вещей, но через некоторое время я заметил, что это обсуждение переносится на Ubuntu, кажется, есть проблема в том, как он управляет некоторыми разрешениями и папками, что вынуждает пользователей использовать sudo npm, Опять же, только в Ubuntu.
aesede
0

Просто выполнить

sudo npm i --save

Вот и все

HA
источник