Github Actions运行rubocop报错cannot load such file -- rubocop-rake
问题背景
在GitHub Actions工作流中配置RuboCop做自动化代码检查时,执行bundle exec rubocop命令抛出如下错误:
Run bundle exec rubocop bundle exec rubocop shell: /usr/bin/bash -e {0} env: BUNDLE_RUBYGEMS__PKG__GITHUB__COM: *** CI_COVERALLS_ENABLED: true cannot load such file -- rubocop-rake /home/runner/work/stripe-sync-service/stripe-sync-service/vendor/bundle/ruby/3.1.0/gems/rubocop-1.30.0/lib/rubocop/config_loader_resolver.rb:17:in 'require' /home/runner/work/stripe-sync-service/stripe-sync-service/vendor/bundle/ruby/3.1.0/gems/rubocop-1.30.0/lib/rubocop/config_loader_resolver.rb:17:in 'block (2 levels) in resolve_requires' /home/runner/work/stripe-sync-service/stripe-sync-service/vendor/bundle/ruby/3.1.0/gems/rubocop-1.30.0/lib/rubocop/config_loader_resolver.rb:13:in 'each' /home/runner/work/stripe-sync-service/stripe-sync-service/vendor/bundle/ruby/3.1.0/gems/rubocop-1.30.0/lib/rubocop/config_loader_resolver.rb:13:in 'block in resolve_requires' <internal:kernel>:90:in 'tap' ... Error: Process completed with exit code 2.
已尝试在执行检查命令前运行gem install rubocop rubocop-rspec rubocop-rails rubocop-performance rubocop-rake全局安装相关gem,确认安装成功后报错仍未消除。受篇幅限制未贴出完整报错堆栈。
故障原因
bundle exec 命令的加载逻辑是仅读取当前项目Gemfile声明、安装到项目指定bundle路径下的gem包,不会加载全局gem目录下安装的包。全局安装的rubocop-rake等插件不在当前项目的bundle加载路径中,RuboCop解析配置文件里声明的require: rubocop-rake规则时找不到对应依赖文件,直接触发加载错误。
可行解决方案
按推荐优先级选择对应方案即可:
- 方案1(最推荐,环境一致性最好):将所有RuboCop相关依赖写入项目Gemfile
打开项目根目录下的Gemfile,将RuboCop及相关插件加入开发/测试依赖组:
本地执行group :development, :test do gem 'rubocop', require: false gem 'rubocop-rails', require: false gem 'rubocop-rspec', require: false gem 'rubocop-performance', require: false gem 'rubocop-rake', require: false endbundle install更新Gemfile.lock后,将Gemfile、Gemfile.lock的变更提交到代码仓库。GitHub Actions执行bundle安装步骤时会自动安装所有声明的依赖,后续再执行bundle exec rubocop即可正常运行。 - 方案2:不写入Gemfile,直接调用全局安装的RuboCop
如果不想把RuboCop相关依赖纳入项目依赖管理,可以去掉命令前的bundle exec前缀,直接调用全局安装的rubocop可执行文件,对应CI步骤示例:
注意:该方案可能因为本地开发环境、CI环境的gem版本不一致导致检查结果存在差异,不推荐在团队协作项目中使用。- name: Install RuboCop dependencies run: gem install rubocop rubocop-rspec rubocop-rails rubocop-performance rubocop-rake - name: Run RuboCop check run: rubocop - 方案3:修正CI中的bundle安装配置
如果项目已经配置了bundle安装路径为vendor/bundle,需要确保CI流程中在执行rubocop前先运行bundle install安装所有Gemfile声明的依赖,不要跳过该步骤直接全局安装gem,避免出现路径不匹配的加载问题。
内容的提问来源于stack exchange,提问作者Sam Egea
相关产品推荐
相关产品推荐

