GitHub Actions无法找到rubocop与httparty gem的原因排查
问题原因与解决方案
核心原因
当你在GitHub Actions中使用ruby/setup-ruby的bundler-cache: true参数时,Bundler会把所有依赖gem安装到独立的bundle专属目录,而非Ruby的全局gem路径。GitHub Actions的默认Shell环境不会自动将这个bundle目录加入Ruby的gem搜索路径,因此出现两个问题:
- 直接运行
./script.rb时,Ruby找不到通过Bundler安装的httparty - 直接运行
rubocop时,系统找不到Bundler安装的rubocop可执行文件(它不在全局PATH中)
本地环境能正常运行,是因为你的本地Shell可能已配置自动加载Bundler环境(比如rbenv、rvm的钩子,或手动设置了环境变量),或是你把gems安装到了全局路径。
解决方案
1. 用bundle exec包裹命令
在GitHub Actions的步骤中,所有依赖Bundler管理的gem的命令,都需要用bundle exec来运行:
修改GitHub Actions的YAML配置中的脚本运行步骤:
- name: Script run: bundle exec ./script.rb
运行rubocop时同样需要:
bundle exec rubocop
bundle exec会临时将Bundler管理的gem路径和可执行文件路径加入当前环境,确保命令能找到对应的依赖。
2. 在脚本中添加Bundler环境加载
如果希望直接运行脚本也能生效,可以在script.rb的最开头添加require 'bundler/setup',让脚本自动加载Bundler的环境配置:
#!/usr/bin/env ruby require 'bundler/setup' # 添加这一行 require_relative 'lib/calls' service = Service.new response = service.get puts response
修改后,只要脚本在有Gemfile和Gemfile.lock的目录下运行,就能自动加载Bundler管理的gem。
补充说明
确保项目根目录存在Gemfile和Gemfile.lock文件,且文件中包含httparty和rubocop的依赖声明,否则bundler-cache: true无法正确安装这些gem。
内容的提问来源于stack exchange,提问作者Alvaro
相关产品推荐
相关产品推荐

