Вкажіть шлях до node_modules в package.json


96

Чи є спосіб перемістити каталог node_modules у програму, скажімо, / vendor / node_modules, як це робить bower з файлом bowerrc? Я думав, що це може бути вказано в package.json, але, здається, я не можу знайти рішення. Ваша допомога дуже вдячна.


Я здогадуюсь щось подібне до http://stackoverflow.com/questions/18974436/change-node-modules-location
sachinjain024

@blunderboy дякую за посилання. Божевільно, що немає простішого способу це зробити. Ну добре.
стуроїд

26
Я не впевнений, чому ви прийняли відповідь, яка явно не відповідає на ваше запитання. Ви запитаєте, як встановити шлях до node_modules inpackage.json , а відповідь xShirase просто не дає способу це зробити.
Mark Amery

4
Ймовірно, він прийняв відповідь, оскільки це цілком очевидно проблема XY, і альтернативне рішення краще, ніж "вибачте, це неможливо".
Jake Holzinger

Відповіді:


58

так, ви можете, просто встановіть змінну env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Відповідно до документа:

Якщо для змінної середовища NODE_PATH встановлено розділений двокрапкою список абсолютних шляхів, то вузол буде шукати ці шляхи для модулів, якщо вони не знайдені в іншому місці. (Примітка. У Windows NODE_PATH розмежовується крапками з комою замість двокрапки.)

Крім того, вузол буде здійснювати пошук у таких місцях:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Де $ HOME - це домашній каталог користувача, а $ PREFIX - налаштований вузол node_prefix.

Це здебільшого з історичних причин. Вам настійно рекомендується розміщувати свої залежності локально в папках node_modules. Вони будуть завантажуватися швидше та надійніше.

Джерело


1
Це чудово. Отже, у моєму випадку, коли у мене є локальні node_modules для кожного додатка, який я будую, я б зробив цей експорт у файл js у проекті?
стуроїд

3
ні, це змінна середовища, вона налаштована на рівні системи. Отже, ви повинні набрати його у своєму терміналі. До змінних env можна отримати доступ у програмі вузла вprocess.env
xShirase

Мда, звучить добре. Мені доведеться ще трохи розібратися в цьому. Дякую за допомогу.
стуроїд

112
Я насправді не думаю, що це відповідь на запитання: він просив властивість у пакеті.json, щоб поставити шлях для LOCAL (рівень програми) npm-Packages. Ця відповідь підказує йому, як він може перемістити ГЛОБАЛЬНО (-g) встановлені пакунки в іншу папку.
Девід Лозерт

2
@IsmailIqbal Вибачте, я щойно побачив ваш коментар. Минуло два роки у світі NPM, і ми зробили досить великий стрибок з кешування, пряжі або навіть npm5, веб-пакетом ... Я б сказав, що обробка node_module в наші дні набагато краща. У вашому випадку я просто зробив би "встановлення npm" у всіх місцях - оскільки npm кешує вже встановлені пакети, це те саме, що скопіювати його вручну без накладних витрат.
Девід Лозерт

28

Коротше кажучи: це неможливо, і, схоже, ніколи не буде підтримуватися (див. Тут https://github.com/npm/npm/issues/775 ).

Є кілька хитрих робочих шляхів із використанням змінних CLI або ENV (див. Поточну вибрану відповідь), .npmrc-Config-Files або npm link- що спільного у всіх: вони ніколи не стосуються лише проекту, а завжди з globalрішень.

Для мене жодне з цих рішень насправді не є чистим, тому що учасникам вашого проекту завжди потрібно створити якусь спеціальну конфігурацію або мати якісь спеціальні знання - вони не можуть просто, npm installі це працює.

Отже: або вам доведеться помістити ваш package.json в ту саму директорію, де ви хочете встановити ваші модулі node_modules, або жити з тим фактом, що вони завжди будуть у кореневій директорії вашого проекту.


16
"Якщо ви хочете написати" node_modules "по-іншому, вибачте, нічого не можу зробити. Це вбудовано в ядро ​​node. Зміна цього рівнозначна побудові зовсім іншого менеджера пакунків." <== хороша робота з використанням змінних, я думаю.
stevedbrown

Коментар від 2019 року: схоже, пряжа підтримує перевизначення каталогу модулів. Ну, я думаю, пряжа - це новий менеджер пакетів.
Вануан

10

Пряжа підтримує цю функцію:

# .yarnrc file in project root
--modules-folder /node_modules

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


6

Я не впевнений, що це те, що ви мали на увазі, але я опинився на цьому питанні, оскільки мені не вдалося встановити node_modulesвсередині мого каталогу проекту, оскільки він був змонтований у файловій системі, яка не підтримує символічні посилання (папка "спільна" VM ).

Я знайшов таке обхідне рішення:

  1. Скопіюйте package.jsonфайл у тимчасову папку іншої файлової системи
  2. Біжи npm installтуди
  3. Скопіюйте отриманий node_modulesкаталог назад у папку проекту, використовуючи cp -r --dereferenceдля розширення символічних посилань у копії.

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

Інші варіанти

Є ще одне обхідне рішення, яке я виявив у питанні github, до якого зв’язано @Charminbear , але це не працює, gruntоскільки воно не підтримує, NODE_PATHяк https://github.com/browserify/resolve/issues/136 :

скажемо, що у вас є, /media/sf_sharedі ви не можете встановити там символічні посилання, а це означає, що ви насправді не можете встановити npm, /media/sf_shared/myprojectоскільки деякі модулі використовують символічні посилання.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (ви можете зробити посилання в цьому напрямку, просто не можете створити його всередині / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.