Распространение сценариев NPM с пакетом для использования проектом, устанавливающим его

Я переместил всю свою конфигурацию линтинга и связанные пакеты / плагины / пресеты (для prettier, stylelint, eslint, commitlint) в пакет npm. Затем я использую этот пакет в нескольких проектах и ​​расширяю или объединяю конфигурацию в локальные файлы конфигурации для проектов, чтобы обеспечить согласованность и устранить необходимость установки и поддержания моих зависимостей разработки в актуальном состоянии.

Наряду с конфигурацией у меня есть несколько полезных сценариев npm, которые запускают линтеры и выполняют множество других функций, связанных с разработкой, например:

"lint:prettier": "prettier 'src/**/*.{js,json}' --write",
"lint:eslint": "eslint 'src/**/*.js'",
"lint:compatibilityCheck": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
"lint": "npm run lint:compatibilityCheck && npm run lint:prettier && npm run lint:eslint"

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


person Undistraction    schedule 10.09.2018    source источник


Ответы (4)


Из блога npm, похоже, что нет "прямых способов" раскрыть сценарии разработки в пакете npm. В сообщении блога предлагается создавать файлы JavaScripts, которые запускают ваши предпочтительные сценарии с использованием модуля shelljs.

Пример: предполагается, что вы хотите раскрыть lint:prettier": "prettier 'src/**/*.{js,json}' --write"

оберните вызов внутрь bin / lintprettier.js:

#! /usr/bin/env node
var shell = require("shelljs");
const path = require("path")

process.env.PATH += (path.delimiter + path.join(process.cwd(), 'node_modules', '.bin'));
shell.exec("prettier 'src/**/*.{js,json}' --write");

Затем добавьте его в экспортированные скрипты консоли в вашем package.json:

...
"bin": {
   "lint-prettier": "bin/lintprettier.js"
}
...

Наконец, вы можете повторно использовать свой скрипт в своем проекте:

"scripts": {
   "build": "...",
   "lint:prettier": "lint-prettier"
 }
person Cristiano    schedule 17.09.2018

Я не уверен, что было бы правильно пытаться разрешить зависимости изменять зависимую конфигурацию, даже если бы я знал простой способ сделать это.

Вместо того, чтобы пытаться идти снизу вверх, сделайте наоборот. Я настоятельно рекомендую использовать lerna.

Это отличный инструмент для управления пакетами в монорепозитории, и вы даже можете поднять общие зависимости между своими пакетами. И, что касается вашей проблемы, он позволяет определять поверх всех ваших пакетов один главный package.json, где вы можете определить npm scripts только один раз, и запустите его для всех пакетов (или только для некоторых из них, используя функцию scope) с помощью одной команды.

person jony89    schedule 17.09.2018

Один из способов сделать это - использовать Builder.

Builder позволяет отправлять сценарии npm в виде пакетов NPM и запускать их в любом проекте, в котором вы установили этот пакет, содержащий сценарии.

В моих случаях использования я помещаю все свои сценарии сборки / тестирования / lint в пакет NPM, а затем устанавливаю этот один пакет во все свои другие проекты. Затем в каждом проекте я могу запускать одни и те же команды.

В последнее время Builder не очень поддерживается, но он довольно стабилен, и я использовал его с большим успехом. README очень подробный и описывает практически все, что вам нужно знать.

Ответ Криштиану тоже хорош, поскольку такой подход может позволить вам лучше контролировать реализацию решения, тогда как со Builder это еще один проект с собственной реализацией (и несколькими проблемами).

person trusktr    schedule 09.02.2020

Я сделал инструмент для решения такого рода проблем. Я называю это Dictator Builder. Это помогает создавать диктаторов, которые являются собственными пакетами NPM.

Диктатора можно настроить так, чтобы он диктовал, что scripts должно быть в package.json, а также предоставлять любые другие необходимые файлы конфигурации:

{
  "message": "Setup package.json and linting",
  "actions": [
    {
      "message": "Should have lint script in package.json",
      "haveJsonPathValues": [
        {
          "expression": "$.scripts.lint",
          "value": "npm run eslint"
        }
      ],
      "target": "package.json"
    },
    {
      "copyFrom": "static-files",
      "target": "."
    }
  ]
}
person Tomas Bjerre    schedule 09.05.2020