参数列表过长-分阶段执行-> tslint

时间:2018-10-14 20:21:30

标签: git npm tslint npm-scripts lint-staged

在我们的项目中,将lint-staged与漂亮和tslint集成在一起后,我们遇到了一个奇怪的问题。 想法是使用prettier 预提交 git hook将tslint然后应用husky到提交中的所有文件。

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

运行prettier后,我们提交了400多个文件。因此,在运行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在整理阶段最终出错。在输出中未给出错误描述。 然后,我们尝试将lint暂存的所有文件路径复制到终端中,并手动对所有这些文件路径运行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的错误消失了,棉绒开始无误地工作了-不管有多少文件作为参数传递。

因此,问题本身已解决。但是问题仍然存在-这种行为的原因是什么?基本上,当使用npm run运行脚本时,我们可以传递有限数量的参数,否则可以传递数量有限的参数。

1 个答案:

答案 0 :(得分:1)

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

但是,如果您使用的是现代Linux x86_64,则应该不会有问题。当然不是只有357个参数。

现在,单个参数的长度不能超过128 KiB。如果您将所有参数传递到单个字符串(作为单个参数)中,则如果每个路径的长度都很大(每个路径大约350个字符),则可以达到极限。

如果不是这种情况,那么您的shell(或链中的其他工具)可能会有一些人为的,更严格的限制。