Как установить npm в указанный каталог?

Ответы:

325

Вы можете использовать --prefixопцию:

mkdir -p ./install/here/node_modules
npm install --prefix ./install/here <package>

Пакеты будут установлены в ./install/here/node_modules. Это mkdirнеобходимо, так как в противном случае npm может выбрать уже существующий node_modulesкаталог выше по иерархии. (См. Документацию npm к папкам .)

coudy
источник
65
Похоже, вам нужно иметь файл package.json в этом альтернативном каталоге, если вы используете опцию --prefix. Есть ли способ иметь package.json в текущем каталоге и установить в альтернативный каталог?
2
@fractal Смотрите мой ответ для этого
yunzen
10
@coundy Есть ли способ указать путь для npm install(без имени пакета)? Я сделал это напрямую, но затем npm ищет package.jsonв {prefix}. Я также хочу, чтобы у вас была возможность войти packages.jsonв корневой каталог проекта и одновременно установить все пакеты {project root}/{project webroot}.
automatix
Я столкнулся с проблемой рекурсии. Есть ли способ сказать, чтобы он запускался один раз? Я решил это временно, изменив каталог, а затем позвонив npm install, но --prefixкажется более удачным решением, если оно не вызывало рекурсию.
adi518
47

В документации сказано: используйте опцию префикса вместе с опцией global :

Префикс конфиг по умолчанию в том месте , где установлен узел. В большинстве систем это / usr / local . В Windows это точное местоположение двоичного файла node.exe. В системах Unix это на один уровень выше, поскольку узел обычно устанавливается в {prefix} / bin / node, а не в {prefix} /node.exe .

Когда глобальный флаг установлен, npm устанавливает вещи в этот префикс. Когда он не задан, он использует корень текущего пакета или текущий рабочий каталог, если его еще нет в пакете.

(Акцент ими)

Таким образом, в вашем корневом каталоге вы можете установить с

npm install --prefix <path/to/prefix_folder> -g

и он установит node_modulesпапку в папку

<path/to/prefix_folder>/lib/node_modules
yunzen
источник
2
Вы не можете requireустановить пакеты глобально, не так ли?
Павло
3
@Pavlo это помогает? stackoverflow.com/questions/15636367/…
юнзен
1
Вы должны добавить это к ответу.
Павло
6
@ Павло Я так не думаю. Это не ответ на ФП.
Юнзен
@Pavlo Если пакет установлен глобально, он требуется вам так же, как и всегда. Так что да, вам может потребоваться пакет, который установлен глобально.
Роб Эванс
43

Начиная с версии 3.8.6 npm, вы можете использовать

npm install --prefix ./install/here <package>

установить в указанный каталог. NPM автоматически создает node_modulesпапку, даже если node_modulesкаталог уже существует в верхней иерархии. Вы также можете иметь package.jsonв текущем каталоге, а затем установить его в указанном каталоге, используя --prefixпараметр:

npm install --prefix ./install/here

Начиная с npm 6.0.0 вы можете использовать

npm install --prefix ./install/here ./

установить package.json из текущего каталога в каталог "./install/here". На Mac я заметил одну вещь: он создает символическую ссылку на родительскую папку внутри директории node_modules. Но это все еще работает.

ПРИМЕЧАНИЕ: NPM учитывает путь, который вы указали в --prefixопции. Это разрешает согласно документации npm для папок , только когда npm installиспользуется без --prefixопции.

Рохит Шарма
источник
1
Это, кажется, не работает, я всегда получаюCan't install <current directory>: Missing package name
Tibor Blenessy
1
@TiborBlenessy Предположим, что вы говорите о втором операторе установки. Пожалуйста, убедитесь, что у вас есть действительный файл package.json в вашем текущем каталоге. Если это все еще не работает тогда, дайте мне знать вашу версию npm. Эти шаги используются для работы с указанной версией npm. И, если они больше не будут, я хотел бы погрузиться глубже и добраться до основной причины, и, возможно, я могу найти альтернативу.
Рохит Шарма
1
@RohitSharma Используя npm 6.0.0, этот метод не работает, так как он ожидает, что package.jsonфайл./install/here
Christian Ivicevic
@ChristianIvicevic Вы можете использовать npm install --prefix ./install/here ./, чтобы установить package.json из текущего каталога в каталог «./install/here». На Mac я заметил одну вещь: он создает символическую ссылку на родительскую папку внутри директории node_modules. Но он все еще работает с npm 6.0.0
Rohit Sharma
1
@Tanoro Третья команда будет работать с npm 6.0.0 с созданием символической ссылки, как указано в ответе. Я никогда не пробовал первые 2 команды с npm v3.5.2, поэтому я упомянул конкретную версию npm, с которой я пробовал. Пожалуйста, не стесняйтесь обновить ответ рабочими командами и для других версий.
Рохит Шарма
0

Я использую сборку powershell и не могу запустить npm без изменения текущего каталога.

Завершается использованием команды запуска и просто указывает рабочий каталог:

start "npm" -ArgumentList "install --warn" -wo $buildFolder
Малахия
источник