Укажите путь к 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 спасибо за ссылку. Это безумие, что нет более простого способа. Ну что ж.
sturoid
26
Я не уверен, почему вы приняли ответ, который явно не отвечает на ваш вопрос. Вы спрашиваете, как установить путь к node_modules inpackage.json , а ответ xShirase просто не дает возможности сделать это.
Марк Эмери
4
Вероятно, он принял ответ, потому что это явно проблема XY, и альтернативное решение лучше, чем «извините, это невозможно».
Джейк Хольцингер

Ответы:

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. Они будут загружаться быстрее и надежнее.

Источник

xShirase
источник
1
Это великолепно. Итак, в моем случае, когда у меня есть локальные node_modules для каждого приложения, которое я создаю, могу ли я выполнить этот экспорт в файл js в проекте?
sturoid
3
нет, это переменная среды, она настраивается на системном уровне. Поэтому вам нужно ввести его в свой терминал. Env переменные доступны в приложении узла вprocess.env
xShirase
Хммм звучит хорошо. Мне нужно еще разобраться с этим. Спасибо за помощь.
sturoid
112
Я действительно не думаю, что это ответ на вопрос: он запрашивал свойство в package.json, чтобы указать путь для ЛОКАЛЬНЫХ (уровень приложения) npm-пакетов. Этот ответ говорит ему, как он может переместить ГЛОБАЛЬНО (-g) установленные пакеты в другую папку.
Дэвид Лозерт
2
@IsmailIqbal Извините, я только что видел ваш комментарий. В мире NPM прошло два года, и мы совершили серьезный скачок с кешированием, пряжей или даже npm5, webpack ... Я бы сказал, что обработка 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-core. Изменение этого равносильно созданию совершенно другого диспетчера пакетов». <== Я думаю, хорошая работа с переменными.
stevedbrown
Комментарий от 2019 года: похоже, что yarn поддерживает переопределение каталога модулей. Ну, я полагаю, yarn - это новый менеджер пакетов.
Vanuan 05
10

Пряжа поддерживает эту функцию:

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

Но ваш опыт может варьироваться в зависимости от того, какие пакеты вы используете. Не уверен, что ты захочешь залезть в кроличью нору.

Вануан
источник
6

Я не уверен, что вы имели в виду именно это, но я остановился на этом вопросе, потому что мне не удалось установить node_modulesвнутри моего каталога проекта, поскольку он был смонтирован в файловой системе, которая не поддерживала символические ссылки («общая» папка виртуальной машины ).

Я нашел следующее обходное решение:

  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
Богатый
источник