加载错误:无法加载“listen”宝石(Rails 5)

74

我有一个基于API模式的Rails 5应用程序,无法让我运行rake routesrails s。我遇到的错误是:

$ rake routes
rake aborted!
LoadError: Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile
.../config/environment.rb:5:in `<top (required)>'
LoadError: cannot load such file -- listen
.../config/environment.rb:5:in `<top (required)>'
Tasks: TOP => routes => environment
(See full trace by running task with --trace)

我已验证listen在我的Gemfile中属于开发组:

group :development do
  gem 'listen', '~> 3.1.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

而且这个信息在我的 Gemfile.lock 文件中:

$ cat Gemfile.lock | grep 'listen'
    listen (3.1.5)
    spring-watcher-listen (2.0.0)
      listen (>= 2.7, < 4.0)
  listen (~> 3.1.5)
  spring-watcher-listen (~> 2.0.0)

我已经更新了bundle,并且安装了bundle,还验证gem install listen可用。这个在本周早些时候是可以工作的,但是我在回顾我的提交记录时没有运气。

$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]

我没有在vendor/cache目录中看到它,但我不确定这意味着什么...


$ bundle package | grep 'listen'

感谢帮助!

更新:

我可以通过在全局Gemfile中加入gem 'listen', '~> 3.1.5'(并从:development中移除它)来“修复”问题。这样所有的错误都会消失,一切都正常了,但这似乎是不正确的。


3
我曾遇到过这个问题,通过运行bundle install --with development test来解决。 - Brent
生产服务器不需要开发和测试的 gem。因此,在执行 bundle install --without development test 后,您可以通过标识环境来运行 Rails 命令。RAILS_ENV=production bundle exec rails sbundle exec rails s -e production - Oshan Wisumperuma
11个回答

111
如果您正在使用Rails 5,并且使用默认的config/environments/development.rb文件,它将在其中包含此行代码。
config.file_watcher = ActiveSupport::EventedFileUpdateChecker

这需要使用宝石依赖项 "listen"。这让我有点困惑,因为我正在将Rails 4升级到Rails 5。

编辑: 忘了提到,如果您注释掉那行代码,就不再需要 "listen" 宝石依赖项了。


4
谢谢。我需要注释掉那行代码。这是一种“悄无声息”的依赖关系,因为在bundler中不会被显示为依赖项。 - Jan Hettich
1
是的,将其注释掉可以消除上面的错误。忘了提到这一点。 - User128848244
1
我将其设置为if defined? Listen的条件语句,而不是将其注释掉。我不想描述这样做的原因... - Eben Geer
1
这对我来说非常关键——理解在开发中,listen(以及spring和spring-watcher-listen)是可选的。我进行了上述development.rb更改,并将这3个gem从Gemfile中注释掉,重新运行bundle install,然后Voila!我的Rails应用程序可以在本地再次运行! :D - Snips
1
我会鼓励在这里使用listen gem,因为它可以更有效地检测开发中的代码更改。 - gerryster

78

你可能不小心在某个时候设置了bundle install --without,我也曾经犯过这个错误。

要撤销此操作,请运行:

bundle config --delete without

我还手动设置了with选项,也因此运行了bundle config --delete with。 运行两者命令应将其恢复为默认行为。

在删除了without配置之后,我成功地再次运行了bundle install,然后我的rails srails db:migrate等命令也正常工作了。


您可以通过运行bundle install并查看输出的倒数第二行来确认是否出现了这个问题。如果它显示:

Gems in the groups development and test were not installed.

那么上述解决方案肯定适用于您。


1
bundle config --delete without 对我解决了这个问题。谢谢。 - SaryAssad
为什么要在生产环境的机器上安装测试/开发用的 gem 包呢?最好还是在显式的生产模式下运行命令。 - nathanvda
运行 bundle install 的建议很有启发性。在本地,这个命令没有在这个应用上运行过(但可能在其他应用上运行过),Bundler 和 Rails 运行得很顺畅。只有在开发模式下部署时才会出现这个问题。那么 cap 命令是所有应用都一样吗? - Jerome

27

我用了这个命令:bundle install --without development

错误:

无法加载'listen' gem。将gem 'listen'添加到Gemfile的开发组中(LoadError)

此后,请使用以下代码:

bundle config --delete without
bundle config --delete with

最后

bundle install

10
像一只驾驶747的猴子一样,我输入了那些命令,结果完美无缺!致意。 - BenKoshy
@BKSpurgeon 这对我没用(另一个答案起作用了),但是你有关猴子驾驶747飞机的滑稽评论值得一赞 :D - Snips
这应该被标记为问题的正确答案。 - Rahul

18

我将这个帖子作为答案发布,但我不喜欢它。

我可以通过在全局Gemfile中添加gem 'listen', '~> 3.1.5'(并从:development中删除它)来“修复”问题。 然后所有的错误都消失了,并且一切正常运行,但这似乎是错误的做法。


现在遇到同样的问题,这个有任何更新吗? - Petros Kyriakou
很抱歉,@PetrosKyriakou,不行。希望发布的解决方案在此期间对您有用。 - lostphilosopher
嗯,它确实可以,但我不比你更喜欢这个解决方案... 不管怎样还是谢谢! - Petros Kyriakou
你好,我想知道是否有可能完全禁用listen gem? 特别是在生产环境下? - ipegasus
今天我遇到了同样的错误,我检查了我的猜测,结果证明我是正确的。我会发布作为可能的答案。 - sonic

11

在经过多次重建尝试后,我找到了一个简单的解决方法。

bundle config --delete without
bundle config --delete with
bundle install

如果您在正确设置环境之前意外建立了gemset,则这可能有助于清除问题。


9

我在运行rails c时遇到了同样的问题。

通过阅读这篇其他 Stack Overflow 帖子,我意识到bundle exec rake命令或rails console运行在默认的production环境中是正常的。

我想要解决这个问题,可以选择以下两种方法之一:

  1. 在~/.bash_profile中添加export RAILS_ENV=production
  2. 显式地指定要执行命令的环境,例如:bundle exec rake a_rake:task RAILS_ENV=productionrails console --env=production

我曾经遇到过同样的问题,因为我使用了“bundle install --without development test”来安装我的应用程序,然后在运行时没有指定“RAILS_ENV=production”。因此,我的应用程序在未安装开发gem的情况下运行于“development”模式。 - Stéphane
这是在我的由capistrano部署的实时应用程序中运行rails c所需的。 - David Gay

8
我今天在将Rails 5.1.5升级到5.2.0后遇到了相似的问题。第一次运行服务器时,出现了以下“缺少资源”的问题:
ActionView::Template::Error (The asset "asterisk_orange.png" is not present in the asset pipeline.)

尝试预编译资产时出现“gem listen error”错误:
$ bundle exec rake assets:precompile
rake aborted!
LoadError: Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile

我的解决方案是明确设置生产环境:

$ RAILS_ENV=production bundle exec rake assets:precompile

这样预编译资产没有问题,'缺少的资产'问题也得到了解决。


6
我曾经遇到过同样的问题,多亏了@newdark的答案,我找到了正确的解决方法。基本上,我想要在production模式下部署Rails,但显然在运行服务器之前忘记设置环境变量RAILS_ENV=production
因此,为production模式安装的依赖项在Rails尝试以development模式启动时已安装,因为忘记设置RAILS_ENV=production。如果我接着向production依赖项中添加gemlisten,那么我将在开发模式下运行而无法注意到。
对我来说,解决方案是在执行任何Rails命令之前执行export RAILS_ENV=production并保持依赖关系不变。希望我已经讲清楚了。

2
我遇到了同样的问题,我通过运行以下命令来解决它:
rails c -e production

解决方案并没有解释问题的真正本质。在生产模式下,Gemfile中不再安装任何listen gem。因此,生产环境完全绕过了这个要求。 - Kunthar
@Kunthar制作不需要使用listen gem。由于代码已经冻结,没有必要监听代码修改。在那里不需要任何开发和测试gems,除非你是在服务器上编码 ;) - Oshan Wisumperuma

1
我在生成mongoid数据库文件时也遇到了同样的错误。但是我在ruby 2.5.1上创建了rails新项目,而你的ruby版本是2.2,所以在我的情况下可能原因不同。当我使用rails new project时,它是在版本5.2中创建的,然后我将gem改成了5.1.2并出现了问题。当我使用rails _5.1.6_ new在Gemfile中创建时,会为开发生成额外的包。
  group :development do
      # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
      gem 'web-console', '>= 3.3.0'
      gem 'listen', '>= 3.0.5', '< 3.2'
      # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
      gem 'spring'
      gem 'spring-watcher-listen', '~> 2.0.0'
    end

这样Gemfile中自动显示了“listen”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接