在我们的项目中,我们在将 lint-staged 与 prettier 和 tslint 集成后遇到了一个奇怪的问题。这个想法是使用pre-commit git hook应用prettier
然后应用tslint
到提交中的所有文件。husky
为了使整个项目符合 描述的新代码样式prettier
,我们决定首先运行prettier
整个项目,然后使用上述 git 钩子提交所有这些文件。
运行后,prettier
我们最终提交了 400 多个文件。因此,在运行时将git commit
lint-staged
所有这 400 多个文件作为参数传递给脚本。prettier
tslint
最初我们有tslint
一个脚本package.json
,如下所示:
"lint": "tslint -c tslint.json --project src/tsconfig.json"
配置lint-staged
如下所示:
{
"linters": {
"*.ts": ["prettier --write", "npm run lint", "git add"]
},
"ignore": ["**/*.spec.ts"]
}
当我们运行git commit
npm 时,在 linting 阶段出现错误。输出中没有给出错误描述。然后我们尝试将 lint-staged 提供给我们的所有文件路径复制到终端并npm run lint
手动运行所有这些文件路径。
我们所说的错误Argument list too long
。
sh: /path-to-app/node_modules/.bin/tslint: Argument list too long
npm ERR! code ELIFECYCLE
npm ERR! errno 126
通过进一步的试验,我们发现在没有任何错误的情况下可以接受的最大文件路径数是 357。因此,当我们运行 linting 脚本时,npm run lint
我们最多只能传递 357 个文件路径作为参数。
然而,有趣的是,如果我们将lint staged
脚本更改为立即使用tslint
(不带npm run lint
):
{
"linters": {
"*.ts": ["prettier --write", "tslint -c tslint.json --project src/tsconfig.json", "git add"]
},
"ignore": ["**/*.spec.ts"]
}
这个错误Argument list too long
消失了,linting 开始工作而没有错误 - 无论有多少文件作为参数传递。
这样,问题本身就解决了。但问题仍然存在——这种行为的原因是什么?基本上,当使用我们运行脚本时,npm run
我们可以传递有限数量的参数,否则 - 无论有多少参数都不会出现问题。