2

为什么我的 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 控制台中。我确保事先停止了所有弹簧过程。

为了进行完整性检查,我删除了上面的整个开发组并捆绑在一起。正如我所料,不再加载 Spring 和 listen 宝石。

4

3 回答 3

3

我在生产中遇到了这种误解。

这是我解决它的方法:

您还可以通过弹出(从中删除 spring gem)您的可执行文件来永久解决此问题:bin/

bin/spring binstub --remove --all

或者

spring binstub --remove --all

您现在可以运行以下命令以进入生产环境中的 Rails 控制台

rails c --environment=production

此外,为避免这种情况在后续场合发生,请努力确保spring gem 仅存在于您的 Gemfile中的development和组中。test

此外,当您在生产中时,请确保始终为命令提供--without development test参数bundle install

bundle install --without development test

而不是通常或常见的

bundle install

请注意:作为指示,无论何时运行命令rails crails console看到以下输出:

在进程 26651 中通过 Spring 预加载器运行警告:Spring 正在生产中运行。要解决此问题,请确保 spring gem 仅存在于您的 Gemfiledevelopmenttest组中,并确保您始终bundle install --without development test在生产中使用

这表明spring gem 正在您的生产环境中运行,应该停止或从您的 bin 可执行文件中完全删除它。

就这样。

我希望这有帮助

于 2020-01-30T16:14:00.760 回答
0

根据spring gem github 页面,看起来rails console会加载 spring:

rails 控制台,rails generate,rails runner

这些执行您已经知道和喜爱的 rails 命令。如果您运行不同的子命令(例如 rails server),那么 spring 将自动将其传递给底层的 rails 可执行文件(没有加速)。

此外,这令人担忧:

您不得在生产环境中安装 Spring。要防止它被安装,请为 bundle install 命令提供 --without development test 参数

rails console(开发)是有意义的,但不是rails console test(或其他环境)。对我来说这似乎是错误的,现在我不喜欢这颗宝石的一个原因。

于 2018-02-22T23:57:21.920 回答
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.

于 2018-02-23T00:12:13.537 回答