如何在lerna monorepo中使用lint-staged在所有软件包中运行同一命令?

时间:2020-07-04 13:00:11

标签: tsc lerna monorepo lint-staged

我有以下根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暂存模块,我的问题是,如何设置它以便命令我目前仍在运行,但仅在暂存文件上运行,而没有在每个项目中安装命令的所有依赖项?由于test命令在每个项目中都运行tsc --noEmit,因此test命令也可能是一个问题,我是否可以强制它也仅检查已暂存的文件?

1 个答案:

答案 0 :(得分:3)

对此有另一种解决方案,因为截至目前,lint-stagedlerna测试命令中还不能很好地发挥作用。

该解决方案涉及在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;"
}