为什么我的spring gem会在错误的(或所有)环境中加载?
我在我的Gemfile中有这个,并且spring gem没有在文件中的任何其他地方列出:
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
当我运行bundle exec rails console test
(对于test
环境)时,Spring进程已启动,Listen
模块已加载到rails控制台中。我确保所有弹簧过程都事先停止了。
为了进行健全性检查,我删除了上面的整个开发组并捆绑了。正如我所料,春天和听的宝石不再被加载。
答案 0 :(得分:1)
我在制作中遇到了误会。
这是我的解决方法:
您还可以通过提升2019-Datacenter
可执行文件(从中删除春季宝石)来永久解决此问题:
bin/
或
bin/spring binstub --remove --all
您现在可以运行以下命令进入生产中的Rails控制台
spring binstub --remove --all
此外,为避免在以后的情况下发生这种情况,请尽力确保spring宝石仅出现在Gemfile的rails c --environment=production
和development
组中。
此外,在生产中,请确保始终为test
命令提供--without development test
参数
bundle install
而不是通常或常见的
bundle install --without development test
请注意:作为指示,每当您运行命令bundle install
或rails c
时,您都会看到以下输出:
在进程26651中通过Spring预加载器运行 警告:Spring正在生产中。要解决此问题,请确保春季宝石仅出现在Gemfile的
rails console
和development
组中,并确保在生产中始终使用test
这表明spring gem在您的生产环境中正在运行,应将其停止或完全从bin可执行文件中删除。
仅此而已。
我希望这会有所帮助
答案 1 :(得分:0)
根据spring gem github page,看起来rails console
会加载弹簧:
rails console,rails generate,rails runner
这些执行你已经知道并喜爱的rails命令。如果你跑 一个不同的子命令(例如rails服务器)然后spring将 自动将其传递给底层的rails可执行文件 (没有加速)。
另外,这令人担忧:
您不得在生产环境中安装Spring。至 防止它被安装,提供 - 没有开发 测试bundle install命令的参数
rails console
(开发)会有意义,但不是rails console test
(或其他环境)。这对我来说似乎有些问题,现在我不喜欢这个宝石的原因。
答案 2 :(得分:0)
Spring通常用于binstubs - 你安装了binstubs吗?如果是,则这是您的rails
命令正在运行的文件。
#!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'
正如您所看到的,只要您使用spring
命令,就会加载rails
。没有检查环境。如果您不想加载spring
,可以使用DISABLE_SPRING=1 rails c test
。