如何在每次推送 Node.js monorepo 之前格式化/测试?

How to format / test before every push in a Node.js monorepo?

我知道几个工具,如 husky、lint-staged 和 prettier,目前我有一个使用 yarn workspaces 和 lerna 的 monorepo,在每次推送之前使用 git 我想要 prettier 格式化我的代码和运行 一个测试脚本,如果每个项目都发生这种情况并不重要,但最好只 运行 项目中发生变化的那些脚本当然,我的问题是什么工具可以真正帮助我有了这个,我该如何设置它们?我是为每个项目单独设置它们,还是可以在我的根 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"
  }
}

您可以在每个 lerna 包的 package.json 中添加 lint: ... 脚本,例如;

./packages/web/package.json

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

./packages/api/package.json

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

并且在主要 package.json 中,您可以添加一个 lint 脚本,运行 包的每个 lint 命令。

最后将其添加到 husky 预提交挂钩中,因此每次提交前它都会 运行。

./package.json

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

在所选答案中添加了关于使用 lint-staged 包的评论,基本上它使您能够将 linting 和其他例程专门应用于更改的文件,而不是所有包。它可能有用,具体取决于您如何使用 monorepo 方法。

/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