Як встановити спеціальне місце для локальної установки пакету npm?


177

Чи можна вказати призначене для користувача пакет призначення npm installчерез командний прапор або змінну середовища?

За замовчуванням локальні встановлення npm закінчуються в node_modulesпоточному каталозі, але я хочу, щоб він встановився, наприклад, у node_modulesіншій директорії vendor/node_modules. Як я можу це зробити?


що ви намагаєтеся досягти? це вже обговорювалося тут: stackoverflow.com/questions/13668097 / ...
Паскаль Belloncle

10
@PascalBelloncle: Замість того, щоб встановлювати пакети у підкаталоги ./node_modules, я хочу, щоб npm встановлював їх у підкаталоги ./vendor/node_modules. (Або бути сказано, що це не налаштовується.)
ПРД

1
Я зрозумів, що це ти хочеш зробити, що, на мою думку, неможливо поза межами. Плюс вимагати теж не вийде. Тож я запитав, чому ти хочеш це зробити. Можливо, є альтернативне рішення робити те, що ти хочеш.
Паскаль Беллонкл

1
Я встановлюю пакет виключно для його бінарного (тобто він буде використовуватися тільки в командному рядку і ніколи не буду required), але я не хочу його встановлювати в усьому світі.
пн

Я бачу. Дивіться мою пропозицію нижче.
Паскаль Беллонкл

Відповіді:


180

TL; DR

Це можна зробити, використовуючи --prefixпрапор і --global* прапор.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Незважаючи на те, що це "глобальна" установка, встановлені скриньки не будуть доступні через командний рядок, якщо не ~/foo/vendor/node_modulesіснує в PATH.

TL; R

Кожен настроюваний атрибут npmможе бути встановлений у будь-якому з шести різних місць. У порядку пріоритетності:

  • Прапори командного рядка: --prefix ./vendor/node_modules
  • Змінні середовища: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Налаштування файлу користувача: $HOME/.npmrcабо userconfigпарам
  • Файл глобальної конфігурації: $PREFIX/etc/npmrcабо userconfigпарам
  • Вбудований файл конфігурації: path/to/npm/itself/npmrc
  • Конфігурація за замовчуванням: node_modules / npmconf / config-defs.js

За замовчуванням входять локально встановлені пакети ./node_modules. глобальні переходять у prefixконфігураційну змінну ( /usr/localза замовчуванням).

Ви можете запустити, npm config listщоб побачити поточну конфігурацію та npm config editзмінити її.

PS

Загалом, npmросійська документація дуже корисна. Розділ папок є хорошим структурним оглядом npm, і розділ config відповідає на це запитання.


2
Як я тестую, насправді, якщо слідувати команді вище, вона буде встановлена ​​у ./vendor/node_modules/lib/bowerвикористанніnpm#3.8.0
e-хмара

2
Роблячи це, я отримую помилкуNo version provided in package.json
FooBar

Ти пишеш bins won't be accessible through the command line. Звичайно, можна викликати програму, використовуючи повний шлях npm install eslint@3.4.0 -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler

13
Чи можливо досягти чогось подібного з файлом package.json? наприклад, якщо я запускаю npm installв каталог A з файлом package.json, пакети будуть встановлені в каталозі B. Схоже, це рішення призначене для встановлення окремих пакетів.
Райан-Ніл Мес

1
Чи є спосіб встановити всі залежності за допомогою цього методу? npm installвстановлює залежності локально. npm install X -g -prefix "..."встановлює модуль X до префікса, npm install -g -prefix "..."встановлює поточний пакет до префікса.
AnnanFay

28

Якщо ви хочете цього в config, ви можете встановити npm config так:

npm config set prefix "$(pwd)/vendor/node_modules"

або

npm config set prefix "$HOME/vendor/node_modules"

Перевірте свою конфігурацію

npm config ls -l

Або як говорить @pje і використовуйте --prefixпрапор


4
Я вважаю, що це встановлює глобальний префікс? Таким чином npm install, все одно буде встановлено локально, ./node_modulesале npm install -gвстановиться до "$(pwd)/vendor/node_modules". Я можу уявити налаштування цього, забувши про це, повертаючись пізніше, цікаво, чому мої глобальні пакети діють дивно.
AnnanFay

13

Для OSX ви можете перейти до свого користувача $HOME(ймовірно, / Користувачі / ваше ім’я /) і, якщо він ще не існує, створити .npmrcфайл (файл, який npm використовує для налаштування користувача) та створити каталог для своїх пакетів npm для бути встановлений у (наприклад, / Користувачі / ваше ім’я / npm). У цьому .npmrc-файлі встановіть "префікс" у вашу нову директорію npm, де буде встановлено "глобально" встановлені npm-пакети; ці "глобальні" пакети, очевидно, будуть доступні лише для вашого облікового запису користувача.

In .npmrc:

prefix=${HOME}/npm

Потім запустіть цю команду з командного рядка:

npm config ls -l

Він повинен дати вихід як для вашої власної локальної конфігурації, так і глобальної конфігурації npm, і ви повинні відобразити свою локальну конфігурацію префікса, відображену, ймовірно, вгорі довгого списку виводу.

Для безпеки я рекомендую такий підхід для налаштування npm-поведінки вашого облікового запису користувача при затисканні /usr/localпапок, що я бачив, як рекомендували в інших місцях.


9

Наприклад, у Windows 7 може бути використаний наступний набір команд / операцій.

Створіть особисту змінну середовища, подвійні косої риски обов'язкові:

  • Назва змінної: %NPM_HOME%
  • Змінне значення: C:\\SomeFolder\\SubFolder\\

Тепер встановіть значення конфігурацій для нових папок (зразкові назви файлів):

  • Встановіть папку npm

npm config set prefix "%NPM_HOME%\\npm"

  • Встановіть папку npm-кеш

npm config set cache "%NPM_HOME%\\npm-cache"

  • Встановіть тимчасову папку npm

npm config set tmp "%NPM_HOME%\\temp"

За бажанням ви можете очистити вміст вихідних папок до зміни конфігурації.

  • Видаліть npm-кеш npm cache clear

  • Перерахуйте модулі npm npm -g ls

  • Видаліть модулі npm npm -g rm name_of_package1 name_of_package2


1
Дякую, я виконую кроки. Але він створює каталог під назвою c: /% NPM_HOME% / npm тощо, а не c: / npm_home / npm
Jay

6

Шукаючи цього, бажаючи, щоб декілька проектів із спільними залежностями були DRYer, я знайшов:

  • Місцева установка - це спосіб Node для всього, що ви хочете використовувати через require()
  • Глобальна установка призначена для бінарних файлів, які ви хочете на своєму шляху, але не призначена ні для чого через require()
  • Використання префікса означає, що потрібно додати відповідні binта manшляхи до$PATH
  • npm link( інформація ) дозволяє використовувати локальну установку як джерело для глобальних компаній

→ дотримуйтесь способу Node та встановіть локально

посилання:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.