Прозрачная установка пакетов 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, Вы могли бы:

  1. скачать зависимость
  2. бежать npm link из каталога зависимости
  3. бежать npm link mycrazydependency от вашего проекта

Подробно здесь: https://docs.npmjs.com/cli/link

Если файл термоусадочной пленки присутствует, то package.json игнорируется Что вам нужно сделать, это изменить URL-адрес, который они получают с помощью операции поиска и замены, как sed ..., Однако я не уверен, что изменить URL-адрес на file:/// синтаксис действителен, но попробуйте.

Другие вопросы по тегам