执行rubocop命令时lint-staged进程卡住问题排查求助
可能的根因及排查方案
根因分析
- Rubocop stdin交互阻塞:lint-staged默认会将修改的文件列表通过stdin传递给命令,而Rubocop在检测到stdin输入时,可能进入等待用户输入的交互模式,导致进程挂起。本地直接执行命令时是直接扫描文件,不会通过stdin传参,因此无此问题。
- bundle环境变量不一致:lint-staged子进程的环境变量(如
BUNDLE_GEMFILE、PATH)与终端直接执行时存在差异,导致bundle查找依赖或Gemfile时异常,引发进程冻结。 - Rubocop-airbnb加载异常:加载rubocop-airbnb规则时可能存在文件锁、依赖冲突或缓存未命中,导致进程卡住。本地直接运行时可能已缓存加载结果,而lint-staged子进程未复用该缓存。
- 命令参数传递冲突:当前配置未明确指定文件处理方式,lint-staged的文件传递逻辑与Rubocop的预期不匹配,引发异常状态。
排查与解决建议
修改命令避免stdin交互:在Rubocop命令中添加
--no-stdin参数,强制不读取stdin,或明确指定文件路径:{ "*.rb": [ "bundle exec rubocop --require rubocop-airbnb --no-stdin" ] }或者使用
--stdin-file-path {relative}参数,让Rubocop正确处理lint-staged传入的文件:{ "*.rb": [ "bundle exec rubocop --require rubocop-airbnb --stdin-file-path {relative}" ] }校验环境变量差异:在lint-staged配置中添加环境变量打印命令,对比终端直接执行的输出:
{ "*.rb": [ "echo $PATH $BUNDLE_GEMFILE", "bundle exec rubocop --require rubocop-airbnb --version" ] }若存在差异,可在命令中手动指定环境变量,例如明确Gemfile路径:
{ "*.rb": [ "BUNDLE_GEMFILE=./Gemfile bundle exec rubocop --require rubocop-airbnb" ] }排除bundle环境问题:尝试直接运行rubocop命令(不通过bundle),验证是否是bundle的问题:
{ "*.rb": [ "rubocop --require rubocop-airbnb --version" ] }若此命令正常,可尝试更新bundle版本,或指定bundle的执行路径。
更新依赖版本:检查rubocop与rubocop-airbnb的兼容性,尝试升级或降级版本,排除已知的兼容性bug。
内容的提问来源于stack exchange,提问作者Fabien
相关产品推荐
相关产品推荐

