加载时 Ruby on Rails 控制台挂起

不管出于什么原因,RubyonRails 控制台拒绝启动; 它只是挂起。我没有对我的代码做任何修改,其他使用相同版本的 Ruby 和 Ruby on Rails 的项目也没有问题。当我最终得到 Ctrl + C时,我得到了这个栈跟踪,它指向 Spring。

我无法解释为什么这种情况会一直发生,而且一直都很正常。我已经通过 RVM 清除了所有 gem,并通过 bundle 命令重新安装了所有 gem,但仍然没有找到。任何想法都可以。

而且据我所知,RubyonRails 服务器也没有任何问题。这个问题与项目有关,但是没有代码发生变化,只有 Ruby on Rails 控制台有这个问题。

Ruby 2.1.2
Rails 4.1.4

user_a@ubuntu:~/work/app_a$ rails console
^C/home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:54:in `gets': Interrupt
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:54:in `verify_server_version'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:25:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/command.rb:7:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/rails.rb:23:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/command.rb:7:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client.rb:26:in `run'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/bin/spring:48:in `<top (required)>'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `load'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `<top (required)>'
from /home/user_a/work/app_a/bin/spring:16:in `require'
from /home/user_a/work/app_a/bin/spring:16:in `<top (required)>'
from bin/rails:3:in `load'
from bin/rails:3:in `<main>'


user_a@ubuntu:~/work/app_a$
32665 次浏览

我猜是 Spring gem 版本有问题。

转到 Gemfile 并注释 gem‘ spring’。然后运行 bundle install并再试一次。

# gem 'spring'

然后:

bundle install

如果您的工作依赖于 gem,请尝试通过以下方式更新 gem:

bundle update

重新启动 Spring 应该修复挂起命令:

$ bin/spring stop

在删除并重新创建一个新的 Ruby on Rails 应用程序之后,我经历了挂起命令(rake、 bin/ails 等)。谷歌没什么用。我希望这是。

当您重新运行命令时,Spring 将自动启动。

如果 $ bin/spring stop不能解决这个问题,那么请检查以确保没有一个孤立的 Spring 进程仍然存在:

$ ps aux | grep -i spring

如果你看到

user  7163  0.0  0.0 110356  2165 pts/3    S+   19:40   0:00 grep --color=auto -i spring
user 16980  0.0  0.4 398826 17580 ?        Sl   Aug31   0:00 spring server | current | started 277 hours ago

然后终止错误的弹簧进程,并尝试再次启动控制台:

$ kill -9 16980
$ rails c

当怀疑 Spring 是奇怪的原因时,尝试运行以下命令:

spring stop && spring start

在 spring gem 的 lib/application.rb 文件中更改以下方法(可以使用 gem info spring 命令显示路径) ,如下所示:

def eager_preload
with_pty do
# we can't see stderr and there could be issues when it's overflown
# see https://github.com/rails/spring/issues/396
STDERR.reopen("/dev/null")
preload
end
end

https://github.com/markiz/spring/commit/5f3ab734fc45d541aaaccb05b59cd95aa49fe8ef