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

Posted

技术标签:

【中文标题】参数列表太长 - lint-staged -> tslint【英文标题】:Argument list too long - lint-staged -> tslint 【发布时间】:2019-03-19 07:01:44 【问题描述】:

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

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

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

最初我们在package.json 中使用tslint 作为脚本,如下所示:

"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 开始工作而没有错误 - 无论有多少文件作为参数传递。

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

【问题讨论】:

【参考方案1】:

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

但是,如果您使用的是现代 Linux x86_64(可能),这应该不是问题;当然不是只有 357 个参数。

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

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

【讨论】:

以上是关于参数列表太长 - lint-staged -> tslint的主要内容,如果未能解决你的问题,请参考以下文章

Unix tar返回参数列表太长[重复]

“参数列表太长”限制是不是适用于 shell 内置函数?

text 删除文件参数列表太长

sh 删除不带参数列表的时间太长

用sed -i参数列表替换所有文件太长[关闭]

Maven 发布分支失败,错误=7,参数列表太长