Установка npm, если package.json был изменен - PullRequest
0 голосов
/ 23 сентября 2018

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?

1 Ответ

0 голосов
/ 23 сентября 2018

Хорошо, так что я сделал с пакетом. Здесь это так.Вы можете использовать его точно так же, как вы указали в своем идеальном сценарии.Просто npm install install-changed и добавьте его в пользовательский скрипт, например pre-run в вашем примере.Он должен выяснить, нужно ли ему npm install, и делает это, если нужно.

 {
  "scripts": {
    "pre-run": "install-changed",
    "my-script": "…"
  },

Вы также можете делать это программно, но я не думаю, что вам это понадобится.

let installChanged = require('install-changed')

let isModified = installChanged.watchPackage() 

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

...