npm install, если package.json был изменен
TL; DR: Есть ли способ, чтобы npm install
автоматически запускать перед запуском любой НПМ сценарий, если ваш 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
Другой способ - добавить git-крюк post-merge
.
Проблема в том, что это решение является локальным для репозитория и не может быть легко разделено. 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
запускается автоматически перед запуском любого НОГО сценария, если ваш package.json
был изменен, не полагаясь на инструментах вне НОЙ экосистемы?
Ответы
Ответ 1
Хорошо, поэтому я закончил с пакетом. Вот оно. Вы можете использовать его точно так же, как вы указали в своем идеальном сценарии. Просто npm install install-changed
сделанных pre-run
npm install install-changed
и добавить его в пользовательском сценарий, как pre-run
в вашем примере. Он должен выяснить, нужно ли ему npm install
и делает это, если это необходимо.
{
"scripts": {
"pre-run": "install-changed",
"my-script": "…"
},
Вы также можете сделать это программно, но я не думаю, что вам это понадобится.
let installChanged = require('install-changed')
let isModified = installChanged.watchPackage()
Вышеупомянутая функция выполняет точно то же самое, кроме того, она также возвращает логическое значение, которое может оказаться полезным.