参数列表太长 - lint-staged -> tslint

Argument list too long - lint-staged -> tslint

在我们的项目中,我们 运行 在将 lint-staged 与 prettier 和 tslint 集成后遇到了一个奇怪的问题。 想法是使用 husky pre-commit git 挂钩将 prettier 然后 tslint 应用于提交中的所有文件。 =36=]

为了使整个项目符合 prettier 描述的新代码样式,我们决定首先对整个项目 运行 prettier 然后提交所有这些带有上述 git 挂钩的文件。

运行宁 prettier 之后,我们最终提交了 400 多个文件。因此,当 运行ning git commit lint-staged 将所有这 400 多个文件作为参数传递给 prettiertslint 脚本时。

最初我们将 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。因此,当我们通过 npm run lint 执行 linting 脚本时 运行 我们可以最多只传递 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 开始正常工作 - 无论有多少文件作为参数传递。

这样,问题本身就解决了。但问题仍然存在——这种行为的原因是什么?基本上,当 运行ning 脚本与 npm run 时,我们可以传递有限数量的参数,否则 - 无论有多少参数都不会出现问题。

可以传递给新进程的参数和环境变量的数量是有限制的。这些限制来自内核本身。

不过,如果你在现代 Linux x86_64(可能),这应该不是问题;当然不是只有 357 个参数。

现在,单个参数的长度不能超过 128 KiB。如果您在单个字符串中传递所有参数(算作单个参数),如果每个路径都非常大(每个大约 350 个字符),您可能会达到限制。

如果情况并非如此,那么您的 shell(或链中的其他一些工具)可能有一些人为的、更严格的限制。