Как 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 установить файл блокировки из родительского процесса, очевидно, все еще используется. Это все еще предположение, но я надеюсь, что это поможет кому-то в будущем.