4

我有以下根 package.json:

{
  "name": "project",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
  "scripts": {
    "build": "lerna run build",
    "dev": "lerna run start --stream --parallel",
    "format": "yarn prettier --write",
    "prettier": "prettier --ignore-path .gitignore \"**/*.+(ts|tsx|json)\"",
    "test": "lerna run test --"
  },
  "husky": {
    "hooks": {
      "pre-commit": "yarn format && yarn test"
    }
  },
  "devDependencies": {
    "husky": "^4.2.5",
    "lerna": "^3.22.1",
    "prettier": "^2.0.5"
  }
}

问题是使用此设置,当我仍在处理文件时我无法提交,要解决此问题,我可以使用 lint-staged 模块,我的问题是,如何设置它以便我目前拥有的命令仍然运行但仅在暂存文件上运行,而不在每个项目中安装命令的所有依赖项?测试命令也可能是一个问题,因为它tsc --noEmit在每个项目中运行,我可以强制它只检查暂存文件吗?

4

2 回答 2

7

对此有一个替代解决方案,因为到目前为止,lint-staged它不能很好地与lerna测试命令配合使用。

该解决方案涉及使用git命令package.json来存储未跟踪且未暂存的文件,执行测试,然后在测试后重新实现未跟踪和未暂存的文件。

此方法的一个例外是 git 将文件更改视为需要手动合并的合并冲突。

以下是要进行的更改:

文件: ./package.json

{
  "name": "project",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
  "scripts": {
    "build": "lerna run build",
    "dev": "lerna run start --stream --parallel",
    "format": "yarn prettier --write",
    "prettier": "prettier --ignore-path .gitignore \"**/*.+(ts|tsx|json)\"",
    "test": "lerna run test",
    "test:staged": "git stash -k --include-untracked; yarn test; git stash apply;"
  },
  "lint-staged": {
    "packages/**/*.{ts,js,json,md}": [
      "prettier --write"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "yarn format && yarn test:staged"
    }
  },
  "devDependencies": {
    "husky": "^4.2.5",
    "lerna": "^3.22.1",
    "prettier": "^2.0.5"
  }
}

更具体地说,这一行:

{
   "test:staged": "git stash -k --include-untracked; yarn test; git stash apply;"
}
于 2020-07-06T21:26:47.037 回答
1

您可能希望安装lint-staged在当前正在开发的那些包中,而不是在您的根项目中。

观点:

例如,一个包可能是基于打字稿的,而其他包可能仍然是基于流的,因此您绝对不希望您的设置文件位于您的根项目上

假设你有两个包:

packages/
  shared-abc
  app-abc

您将需要安装lint-staged在您和您的团队正在开发的软件包上。

$ npx lerna add --dev lint-staged --scope=@my-abc/app-abc

然后在您安装的软件包lint-staged上定义配置文件.lintstagedrc,例如:

{
  "*.{js,jsx,ts,tsx}": ["eslint --fix"]
}

顺便说一句,您可能还想在每个 lerna 上安装eslint,或两者都安装(而不是在根项目中)。prettierpackage

$ npx lerna add --dev eslint --scope=@my-abc/app-abc

上面的配置文件告诉lint-staged运行该包中已暂存的每个eslint --fix文件。

这种方法允许您为不同的包拥有具有不同 linting 或更漂亮设置的单独文件.eslintrc.js或文件。.prettierrc

如果您在项目根目录中安装了lint-stagedeslintprettier等,对于每个暂存文件,您的 git 挂钩(或 husky)可能会eslint --fix在不同的包上以相同的设置运行,这些包可能有非常特定的环境要求。您.eslintrc.js可能会很混乱并且充满了覆盖。

结论

所以lint-staged在你的包中安装之后,你希望你的 git hook(或 husky)使用 lerna 运行以下命令行:

npx lerna run lint-staged

现在您仍然需要将此脚本添加到所需包的 package.json 文件中。

{
...
scripts: {
   ...
   "lint-staged": "lint-staged",      
   ...
}
...
}

因此 lerna 将lint-staged在所有将脚本lint-staged添加到scripts其 package.json 文件条目的包上运行脚本。

于 2022-01-04T14:57:37.333 回答