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() 

Вышеупомянутая функция выполняет точно то же самое, кроме того, она также возвращает логическое значение, которое может оказаться полезным.