Как npm обрабатывает файлы блокировки

Итак, я бегу npm install xyz внутри скрипта, который вызывается хуком postinstall npm другого модуля npm. (Давайте не будем вдаваться в причину, пожалуйста, но это связано с необязательными зависимостями, которые не поддерживаются npm)

npm install moduleA
  -> installing moduleA
    -> running postinstall hook (my script)
      -> my script runs npm install xyz

Когда я запускаю сам скрипт, установка npm выполняется достаточно быстро, но когда я устанавливаю модуль в хуке postinstall, скрипт ждет в файле блокировки не менее 1 минуты. (или так я предполагаю)

Когда я включаю подробный уровень логирования в npm, я получаю вывод, как показано ниже:

[a lot more lines above]
npm verb addNamed "latest" is being treated as a dist-tag for invert-kv
npm info addNameTag [ 'invert-kv', 'latest' ]
npm verb addNameTag registry:https://registry.npmjs.org/invert-kv already in flight; waiting
npm verb addNamed "1.0.0" is a plain semver version for invert-kv
npm verb afterAdd /Users/path/.npm/invert-kv/1.0.0/package/package.json not in flight; writing
npm verb correctMkdir /Users/path/.npm correctMkdir not in flight; initializing
npm verb afterAdd /Users/path/.npm/invert-kv/1.0.0/package/package.json written
npm verb cache add spec camelcase@^3.0.0
npm verb addNamed ">=3.0.0 <4.0.0" is a valid semver range for camelcase
npm verb addNameRange registry:https://registry.npmjs.org/camelcase not in flight; fetching
npm verb get https://registry.npmjs.org/camelcase not expired, no request
npm verb addNamed "3.0.0" is a plain semver version for camelcase
npm verb afterAdd /Users/path/.npm/camelcase/3.0.0/package/package.json not in flight; writing
npm verb correctMkdir /Users/path/.npm correctMkdir not in flight; initializing
npm verb afterAdd /Users/path/.npm/camelcase/3.0.0/package/package.json written
npm verb correctMkdir /Users/path/.npm/_locks correctMkdir not in flight; initializing

ждет здесь как минимум одну минуту

npm verb lock using /Users/path/.npm/_locks/staging-d21af557b41d4821.lock for /Users/path/Desktop/t/node_modules/.staging
npm verb unbuild node_modules/.staging/abbrev-ac014442
npm verb unbuild node_modules/.staging/ansi-regex-12e09986
npm verb unbuild node_modules/.staging/ansi-styles-1359ba2f
npm verb unbuild node_modules/.staging/aproba-d9971840
npm verb unbuild node_modules/.staging/array-find-index-c1ddfc4c
[a lot more lines below]

Теперь, глядя на код правильного Mkdir, кажется, что просто загрузить все файлы в /Users/path/.npm/_locks в память и попытаться восстановить разрешение? Точно сказать не могу.

correctMkdir вызывается замком. Это похоже на хеширование файла и какое-то шифрование? Тоже не уверен.

После обратного инжиниринга кода npm я добился прогресса, изменив конфигурацию для cache-lock-stale, cache-lock-wait до 10 мс. К сожалению, он все еще висит слишком долго, прежде чем все установить правильно. Я подозреваю, что измененный конфиг не учитывается при изменении прямо перед тем, как npm будет в полете? Может быть? Может быть, это что-то совершенно другое?:)

Кто-нибудь, кто может намекнуть мне правильное направление? Что я могу сделать, чтобы ускорить процесс?

1 ответ

Решение

После ночного сна установка кажется намного быстрее. Я предполагаю, что некоторое кэширование все еще зависало в моей папке _locks.

Итак, ответ был:

Задавать cache-lock-stale а также cache-lock-wait в 10ms каждый временно и npm не будет ждать окончания срока действия файла блокировки. Насколько я понимаю, npm пытается дождаться завершения всех файлов блокировки в папке _lock, и поскольку мы запускаем npm, установить внутри npm установить файл блокировки из родительского процесса, очевидно, все еще используется. Это все еще предположение, но я надеюсь, что это поможет кому-то в будущем.

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