Как форматировать / тестировать перед каждым нажатием в монорепозитории Node.js?

Я знаю несколько инструментов, таких как хаски, lint-staged и prettier, в настоящее время у меня есть монорепозиторий, использующий рабочие области пряжи и lerna, перед каждым нажатием с помощью git я хочу, чтобы красивее форматировал мой код и запускал тестовый скрипт, это не имеет значения если это происходит в каждом проекте, но было бы неплохо запускать эти сценарии только в тех проектах, которые, конечно, были изменены, мой вопрос: какие инструменты действительно могут мне в этом помочь и как их настроить? Могу ли я настраивать их для каждого проекта индивидуально или я могу что-то настроить в моем корневом package.json? В настоящее время это выглядит как

{
  "name": "orgname",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
  "scripts": {
    "build": "lerna run build",
    "dev": "lerna run start --stream --parallel",
    "test": "lerna run test --"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm test"
    }
  },
  "prettier": {
    "semi": true,
    "singleQuote": true,
    "trailingComma": "es5"
  },
  "devDependencies": {
    "lerna": "^3.22.1"
  }
}


person Community    schedule 27.06.2020    source источник
comment
Взгляните на хуки git. Это позволяет вам запускать скрипты до / после такой операции, как push.   -  person Mody    schedule 27.06.2020
comment
Husky позволяет мне настраивать эти хуки, но я все еще не уверен, следует ли мне устанавливать их в корне моего монорепозитория или в отдельных проектах.   -  person    schedule 27.06.2020


Ответы (2)


Например, вы можете добавить lint: ... скрипт внутри package.json каждого пакета lerna;

./packages/web/package.json

 ...
  "scripts": {
   "lint": "vue-cli-service lint --fix"
  },

./packages/api/package.json

 ...
  "scripts": {
   "lint": "eslint --fix src",
  }

а в главном package.json вы можете добавить сценарий lint, который запускает каждую команду lint пакетов.

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

./package.json

 "scripts": {
   "lint": "lerna run lint"
  },
  "husky": {
    "hooks": {
      "pre-commit": "yarn lint && yarn test"
    }
  }

person onuriltan    schedule 27.06.2020
comment
Спасибо, почему люди устанавливают один скрипт внутри записи, созданной с помощью линта? Почему бы им напрямую не добавить этот сценарий в крючок хаски, как вы это сделали? - person ; 27.06.2020
comment
С помощью lint-staged вы можете писать совпадающие шаблоны и применять разные команды линтинга к каждому совпадающему образцу, поэтому я считаю, что он используется, но мне это не нужно, поскольку я могу выполнять свою операцию линтинга только с одной командой eslint в обоих проектах - person onuriltan; 27.06.2020
comment
Есть еще одно ОГРОМНОЕ преимущество в использовании lintstaged: линтинг частично примененных коммитов, когда не все измененные файлы будут зафиксированы, поэтому команда линтинга может быть выполнена для этих конкретных изменений. В монорепозитории, поскольку он быстро растет, он будет отличным шаблоном для помощи в таких сценариях. - person Luís Brito; 28.06.2020
comment
@ LuísBrito теперь я понимаю, что git add делает в lint staged, он в основном проверяет, какие файлы были изменены в git add, и связывает только те, правильно? - person onuriltan; 28.06.2020
comment
Да, это немного сложнее, чем в реальной жизни, он фактически прячет вещи и перезаписывает файлы на ходу при выполнении с использованием хэшей git, но в результате вы можете вносить частичные изменения в пакет или даже частичные изменения в один файл, если не все его изменения еще были перенесены в git. - person Luís Brito; 28.06.2020
comment
Название происходит от линтинга только того, что поставлено в git для нового коммита. В качестве примера я работаю с производственным приложением, разработанным как монорепозиторий, в настоящее время с более чем 50 различными пакетами. Запуск полного линта или только того, где я изменил некоторые файлы, меняет правила игры для повседневной продуктивности. - person Luís Brito; 28.06.2020
comment
Вы также должны увидеть аргументы --since HEAD lerna, чтобы применить команду только к пакетам, которые изменились с момента последней фиксации. - person Luís Brito; 28.06.2020

Добавлен комментарий к выбранному ответу об использовании пакета lint-staged, в основном он позволяет применять линтинг и другие процедуры специально к измененным файлам, а не ко всему пакету. Это может быть полезно, в зависимости от того, как вы используете подход монорепозитория.

/packages/example-name/.lintstagedrc.json

{
  "*.{js,ts}": ["eslint --fix", "git add"]
}

/packages/example-name/package.json

{
  [...]

  "scripts": {
    "precommit": "lint-staged"
  }

  [...]
}

/package.json

{
  [...]

  "husky": {
    "hooks": {
      "pre-commit": "lerna run precommit --since HEAD"
    }
  },

  [...]
}

Для получения дополнительной информации: https://github.com/okonet/lint-staged.

person Luís Brito    schedule 28.06.2020