Запуск npm `postinstall` script после завершения первоначальной установки` npm install`? (Может быть, с помощью трюка Node?)

Я пытаюсь создать модуль npm с postinstall script, который изменит пользователя package.json и переустановит пакеты. Я почти там, но проблема, с которой я столкнулась, заключается в том, что CLI npm запускает мой postinstall script слишком рано.

Есть ли способ, возможно, используя трюк Node или системного уровня, чтобы ждать завершения всего процесса npm install до запуска моего script? Например, когда npm вызывает мой postinstall script, в это время я могу зарегистрировать еще один script для запуска после завершения npm install?

Что я подразумеваю под "слишком рано"? Например, после yarn install, файл yarn.lock не будет точно отражать package.json, если мой script вмешивается в yarn install. Однако, если мой script ждет завершения yarn install и затем запускает еще один yarn install, файл yarn.lock будет точным, а в дальнейшем yarn install команды выведут "Уже обновленный".

Ответ 1

Рассмотрите закалку непосредственно с package.json как плохую практику, потому что Devs больше не будет контролировать пакеты, которые они установили, или даже имя их проекта.

Поэтому пакеты должны вместо этого запрашивать Dev для изменения package.json во время установки и предлагать метод, позволяющий Devs для сухого запуска изменений, которые будут сделаны.

TL;DR; обязательно дайте полное согласие на Dev для любого отпуска с помощью package.json.

Вот почему я считаю, что альтернативные методы лучше, чем использование postinstall script. Самое минимальное решение, с которым я столкнулся:

myinstall.js

const exec = require('child_process').exec;
exec('npm run install').on('exit', () => exec('npm run mypostinstall'));

package.json

"scripts": {
  "myinstall": "node myinstall.js",
  "mypostinstall": "echo \"myPostinstall called\""
},

Установите mypostinstall script, равный postinstall.

Примечание. В приведенном выше примере нет обработки ошибок, текст не отображается и фактическая запись в package.json отсутствует. Это чисто для иллюстрации того, как выполнить код выполнения после npm install. Причина, по которой текст не отображается, заключается в вызове exec, для которого новый процесс вызывается с помощью "личного" stdout. В качестве альтернативы используйте fork, дополнительную информацию можно найти здесь в документации node.

Я попытался вызвать npm install вместо npm run myinstall, установив "install": "node myinstall.js". Однако теперь exec('npm run install') будет рекурсивно называть себя.

Ответ 2

postInstall, как вы обнаружили, имеет очень необычный способ исполнения и прослушивается в некоторых версиях npm (все pre npm 3). Это было исправлено в более поздних версиях. Прежде всего убедитесь, что ваша версия на npm Дата; Если это у вас есть 2 варианта, которые я могу дать вам от головы,

Вариант 1

Это самое простое решение, используйте этот script, он сам объясняет, что он установит все и, чтобы быть в безопасности, дайте пост установить один раз. Не самое идеальное решение, но оно должно работать без проблем.

#!/bin/bash
npm install
npm run postinstall

Вариант 2

Попробуйте переместить devDependencies на dependencies, если это возможно, для некоторых пользователей это, похоже, устраняет проблему postInstall. Но я не рекомендую его devDependencies.

UPDATE

Хорошо, теперь я получаю эту проблему, но она должна быть покрыта небольшим изменением варианта 1 script. Поскольку ваша postinstall script уже может обрабатывать модификацию и повторную установку.

#!/bin/bash
npm install
cd (<path to your modue> && npm run postinstall)