TL; DR: есть ли способ автоматически запустить npm install
перед запуском любого сценария npm, если ваш package.json
был изменен?
Сценарий проблемы
Вы извлекаете или извлекаетеветка которая обновила package.json
.Вы бежите npm run my-script
.my-script
зависит от пакета, который был недавно добавлен в package.json
.my-script
не удается.Вы удивляетесь, почему.Перед тем, как перевернуть стол, вы запускаете npm install
просто для уверенности.my-script
успешно выполняется.Вам не нужен новый рабочий стол.
Я знаю, что инструменты для сборки / запуска задач, такие как gradle
, перед выполнением задачи проверяют актуальность ваших зависимостей.Я всегда был (незначительным) больным, что npm
этого не делает.Я наткнулся на два решения, которые мне особенно не нравятся.
Неидеальное решение: сделайте
Вместо того, чтобы полагаться на сценарии npm в вашем package.json
для запуска команд, которые вы используете make
и использовать его интегрированное отслеживание зависимостей с помощью следующего трюка:
# Smart install: Only executes if package.json's
# modification date is later than node_module's
node_modules: package.json
npm install
@rm -f node_modules/.modified
@touch -m node_modules/.modified
install: node_modules
Источник: https://mattandre.ws/2016/05/make-for-hipsters/
Проблема в том, что вы знаете, что для запуска сценариев вам нужно полагаться на make
потерять некоторые преимущества сценариев npm, такие как удобная ссылка на другие сценарии и параллельное выполнение сценариев (npm-run-all
).Также труднее работать с другими, если они не знают make
или имеют проблемы с его запуском (Windows).Это архаичный инструмент вне экосистемы node / npm и слишком дорогой только для этого преимущества умной установки.
Неидеальное решение: Git hook
Другой способ - добавить post-merge
githook.
Проблема в том, что это решение является локальным для хранилища и не может быть легко распространено.npm install
будет запускаться автоматически только при git-слияниях.Когда вы изменяете package.json
любым другим способом, вы все равно должны помнить о запуске npm install
.Правда, это незначительный момент на практике.Тем не менее, было бы неплохо вообще никогда не думать о запуске npm install
, если вы хотите запустить скрипт.
Источник: https://davidwalsh.name/git-hook-npm-install-package-json-modified
Идеальное решение
Я хотел бы определить мой package.json
так, как:
{
"scripts": {
"pre-run": "npm-smart-install",
"my-script": "…"
},
"dependencies": {
"npm-smart-install": "1.0.0"
}
}
npm-smart-install
- гипотетический пакет npm, который я хотел бы существовать.pre-run
- гипотетический хук жизненного цикла npm-scripts.Когда я запускаю npm run my-script
и package.json
был изменен с момента последнего запуска любого скрипта, запустите npm install
перед запуском my-script
.
Повторите: есть ли способ запустить npm install
автоматически перед запуском любого скрипта npm, если ваш package.json
был изменен без использования инструментов вне экосистемы npm?