MacOS下Rails执行generate controller命令报GemNotFound错误求解
Rails控制器生成时报Bundler::GemNotFound错误解决方案
问题场景
- 系统环境:MacOS,使用rbenv管理Ruby版本,Ruby版本为2.6.3,Rails版本为6.1.4.x
- 复现步骤:
- 执行
rails new my-app创建项目成功 - 进入项目目录执行
rails s启动服务成功,可正常访问localhost:3000默认页 - 执行
rails g controller home index时抛出如下错误:
- 执行
Traceback (most recent call last): 20: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/bin/spring:49:in `<main>' 19: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/client.rb:30:in `run' 18: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call' 17: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/client/server.rb:9:in `call' 16: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 15: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 14: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/server.rb:9:in `<top (required)>' 13: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 12: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 11: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/commands.rb:4:in `<top (required)>' 10: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.1/lib/spring/commands.rb:33:in `<module:Spring>' 9: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 8: from /Users/marcoscampos/.rbenv/versions/2.6.3/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' 7: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/setup.rb:20:in `<top (required)>' 6: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/ui/shell.rb:88:in `silence' 5: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/ui/shell.rb:136:in `with_level' 4: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/setup.rb:20:in `block in <top (required)>' 3: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler.rb:149:in `setup' 2: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/runtime.rb:18:in `setup' 1: from /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/definition.rb:228:in `specs_for' /Library/Ruby/Gems/2.6.0/gems/bundler-2.2.26/lib/bundler/definition.rb:490:in `materialize': Could not find sqlite3-1.4.2, puma-5.4.0, bootsnap-1.7.7, byebug-11.1.3, nio4r-2.5.8, msgpack-1.4.2, bindex-0.8.1, nokogiri-1.12.3, websocket-driver-0.7.5, sassc-2.4.0, ffi-1.15.3, racc-1.5.2 in any of the sources (Bundler::GemNotFound)
对应的Gemfile内容如下:
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.3' gem 'rails', '~> 6.1.4', '>= 6.1.4.1' gem 'sqlite3', '~> 1.4' gem 'puma', '~> 5.0' gem 'sass-rails', '>= 6' gem 'webpacker', '~> 5.0' gem 'turbolinks', '~> 5' gem 'jbuilder', '~> 2.7' gem 'bootsnap', '>= 1.4.4', require: false group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do gem 'web-console', '>= 4.1.0' gem 'rack-mini-profiler', '~> 2.0' gem 'listen', '~> 3.3' gem 'spring' end group :test do gem 'capybara', '>= 3.26' gem 'selenium-webdriver' gem 'webdrivers' end gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
根因说明
这个错误是Spring预加载服务缓存了错误的Ruby环境路径导致的:启动Rails服务时用的是rbenv管理的用户级Ruby环境,gem包安装在用户目录下;但调用rails generate命令时,Spring调用了系统自带的Ruby,系统Ruby路径下没有安装项目需要的对应版本gem,因此抛出找不到依赖的错误。
解决步骤
按顺序执行以下操作即可:
- 停止当前运行的Spring服务,清除缓存:
spring stop
- 校验当前Ruby环境是否为rbenv管理的2.6.3版本:
which ruby # 预期输出为 /Users/你的用户名/.rbenv/shims/ruby,若输出为/usr/bin/ruby则说明用的是系统Ruby ruby -v # 预期输出为 ruby 2.6.3 相关版本信息
如果环境不匹配,执行以下命令切换:
rbenv local 2.6.3 rbenv rehash
- 重新安装项目所有依赖:
bundle install
如果安装原生gem(如sqlite3、ffi)时报编译错误,先安装Xcode命令行工具后重试:
xcode-select --install
- 重新执行控制器生成命令:
rails g controller home index
内容的提问来源于stack exchange,提问作者mcgha
相关产品推荐
相关产品推荐

