Прозрачная установка пакетов npm в автономном режиме из пользовательского каталога файловой системы.
Примечание редактора: оригинальное название вопроса было "Использовать npm install для установки узловых модулей, хранящихся в локальном каталоге", что сделало желание прозрачно переопределить источник установки менее очевидным. Поэтому некоторые существующие ответы предлагают решения, основанные на изменении процесса установки.
Я знаю, что это простая вещь, но я совершенно новичок во всем в этой области, поэтому после поиска и постоянного поиска ответов, которые на самом деле не были тем, что я хотел, я решил просто спросить напрямую.
В настоящее время у меня есть процесс, который запускается в каталоге FOO, который вызывает npm install. Директория FOO содержит файл package.json и файл npm-shrinkwrap.json для указания модулей (в данном случае bluebird, extension и mysql, но это не имеет значения) и версий. Это все прекрасно работает.
Но теперь вместо того, чтобы обращаться к Интернету, чтобы получить модули, я хочу, чтобы они были сохранены в локальном каталоге BAR и чтобы процесс в foo использовал npm для их установки оттуда. Я не могу хранить их постоянно в FOO, но могу в BAR по независящим от меня причинам. Я знаю, что это относительно просто, но я не могу получить правильный набор команд. Спасибо за помощь.
3 ответа
Примечание. В этом ответе изначально предлагалось только переопределить местоположение кеша. Хотя это работает в принципе, npm
все еще пытается связаться с сетью для каждого пакета, вызывая чрезмерные задержки.
Я предполагаю, что вы намерены прозрачно изменить источник установки: другими словами: вы не хотите менять свой пакет, вы просто хотите позвонить npm install
как и раньше, но пакеты должны быть установлены из вашей пользовательской файловой системы, в автономном режиме (без необходимости подключения к Интернету).
Загадка состоит из двух частей:
переопределить
npm
Расположение файловой системы в кеше (где кэшируются ранее загруженные пакеты), указывающее на ваше пользовательское местоположение:Обратите внимание, что кэшированные пакеты хранятся определенным образом:
package.json
файл хранится в подпапкеpackage
и молнию на упаковке в целом какpackage.tgz
, Проще всего скопировать пакеты из существующего кэша в выбранное вами место или просто установить дополнительные необходимые, когда у вас есть подключение к Интернету, которое автоматически их кэширует.Для прозрачного использования (
npm install
можно назвать как обычно)- Установив элемент конфигурации глобально:
npm config set cache '/path/to/BAR'
- Обратите внимание, что это вступит в силу для всех
npm
операции, настойчиво.
- Через переменную окружения (которая может быть ограничена сценарием или даже одной командой):
export npm_config_cache='/path/to/BAR'
npm_config_cache='path/to/BAR' npm install
- Установив элемент конфигурации глобально:
- Специальное использование через параметр командной строки:
npm install --cache /path/to/BAR
сила
npm
использовать кэшированные пакеты:- В настоящее время это требует обхода через
cache-min
элемент конфигурации.- Более прямая особенность, например, через
--offline
коммутатор был запросом функции в течение многих лет - см. https://github.com/npm/npm/issues/2568
- Более прямая особенность, например, через
- Хитрость заключается в том, чтобы установить
cache-min
к очень высокому значению, так что все пакеты в кэше считаются свежими и обслуживаются оттуда:- Для прозрачного использования (
npm install
можно назвать как обычно)- Установив элемент конфигурации глобально:
npm config set cache-min 9999999999
- Обратите внимание, что это вступит в силу для всех
npm
операции, настойчиво.
- Через переменную окружения (которая может быть ограничена сценарием или даже одной командой):
export npm_config_cache_min=9999999999
npm_config_cache_min=9999999999 npm install
- Установив элемент конфигурации глобально:
- Специальное использование через параметр командной строки:
npm install --cache-min 9999999999
- Для прозрачного использования (
- В настоящее время это требует обхода через
Предполагая, что вы установили cache-min
глобально или через переменную среды, работает npm install
теперь должны обслуживать пакеты прямо из вашего пользовательского расположения в кэше.
Предостережения:
Это предполагает, что все пакеты ваши
npm install
потребности доступны в вашем собственном местоположении; Попытка установить пакет, который не находится в кеше, очевидно, потерпит неудачу без подключения к Интернету.И наоборот, если у вас есть доступ в Интернет, но вы хотите предотвратить
npm
использовать его для получения пакетов - что он все еще будет пытаться, если пакет не найден в кэше - вы должны изменитьregistry
элемент конфигурации к чему-то недопустимому, чтобы заставить неудачную попытку установки онлайн; например:export npm_config_registry=http://example.org
- Обратите внимание, что URL должен существовать, чтобы избежать задержек во время
npm
пытается подключиться к нему; в то время как вы можете установить значение на что-то синтаксически недопустимое (например,none
),npm
будет выдавать предупреждение при каждом использовании.
Образец bash
сценарий:
#!/usr/bin/env bash
# Set environment variables that set npm configuration items to:
# - redefine the location of the cache folder
# - make npm look in the cache only (assuming the packages are there)
# Note that by doing this inside a script the changes will only take effect
# in the script and NOT persist.
export npm_config_cache='/path/to/BAR' npm_config_cache_min=9999999999
# Now cd to your package and invoke `npm install` as usual.
cd '/path/to/project'
npm install
Вы можете попробовать npm link
, Вы могли бы:
- скачать зависимость
- бежать
npm link
из каталога зависимости - бежать
npm link mycrazydependency
от вашего проекта
Подробно здесь: https://docs.npmjs.com/cli/link
Если файл термоусадочной пленки присутствует, то package.json
игнорируется Что вам нужно сделать, это изменить URL-адрес, который они получают с помощью операции поиска и замены, как sed ...
, Однако я не уверен, что изменить URL-адрес на file:///
синтаксис действителен, но попробуйте.