在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告

Posted

技术标签:

【中文标题】在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告【英文标题】:Rails 2.3-style plugins and deprecation warnings running task in Heroku 【发布时间】:2012-02-20 02:16:03 【问题描述】:

我正在升级到 Rails 3.2,运行 rake db:migrate 给了我几个形式的错误:

弃用警告:您在 vendor/plugins 中有 Rails 2.3 风格的插件! Rails 4.0 将删除对这些插件的支持。将它们移出并将它们捆绑到您的 Gemfile 中,或者将它们作为 lib/myplugin/* 和 config/initializers/myplugin.rb 折叠到您的应用程序中。有关更多信息,请参阅发行说明:http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released。 (从 /app/Rakefile:7 调用)

令人困惑的是我的vendor/plugins 目录是空的——它是否引用了另一个插件目录?

【问题讨论】:

对我来说更加困惑,因为我在那里确实有东西,但是在删除它之后仍然会出现 Heroku 的错误!好问题,好答案 【参考方案1】:

你在使用 Heroku 吗?

Heroku 将在 Rails 3.x 应用程序中注入插件。 为了避免这种情况 在 Rails 3 中注入,在你的文件中包含 rails_12factor gem 应用。 (Heroku Ruby Support2013-10-26)

rails 4 中也需要 rails_12factor gem。

如果您的应用程序中没有此 gem,您将收到一个 部署时发出警告,您的资产和日志将不会 功能性的。 (Rails 4 on Heroku2013-10-26)

就在 2013-08 年,heroku 总是在 rails 3 应用程序中注入插件,即使是带有推荐 gem 的应用程序也是如此。这是 ruby​​ buildpack 的一个问题,由 PR 11 修复,于 2013-08-06 合并。

【讨论】:

是的,我意识到所有的警告都来自我的 Heroku 脚本和日志。我假设 (a) 它是插件注入,并且 (b) Heroku 团队会在它成为实际问题之前解决这个问题。 我是新手,我对如何编辑 railties-3.2.0 有点困惑。你能帮忙吗? @vezu 我建议你不要开始。在我们开始使用 bundler 之前,这曾经很常见,但现在它不太可能工作,而且可能只会破坏一些东西。 我尝试添加一个初始化程序gist.github.com/1709421,但它不起作用(我猜插件比应用程序初始化程序更早加载)。我的建议是不要担心......它只是噪音。 一年后...heroku 没有变化。【参考方案2】:

你可以试试

::ActiveSupport::Deprecation.silenced = true

在您的production.rb 中,因为它只是噪音。

【讨论】:

理想情况下,一个人只会压制这个特定的警告,你知道这是否可能吗? 如果您在 production.rb 中执行此操作,您应该会看到开发中的错误 - 如果所有其他方法都失败,请在 development.rb 中设置相反的内容 不为我抑制警告 抑制此警告的一个技巧是将以下内容添加到 application.rb:ActiveSupport::Deprecation.behavior = Proc.new |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ 【参考方案3】:

在 config/environment.rb 添加:

ActiveSupport::Deprecation.silenced = true 

在初始化rails之前,像这样:

# Load the rails application                                                                                                                                             
require File.expand_path('../application', __FILE__)

ActiveSupport::Deprecation.silenced = true                                                                                                                               

# Initialize the rails application                                                                                                                                       
MyApp::Application.initialize!

类似地,要在 rake 任务中禁用警告,请在 Rakefile 顶部附近插入静音配置:

# Load the rails application                                                                                                                                             
require File.expand_path('../application', __FILE__)

ActiveSupport::Deprecation.silenced = true                                                                                                                           

# Initialize the rails application                                                                                                                                       
MyApp::Application.initialize!

您可以选择将其包装在一个块中以仅在生产中保持静音:

if ENV['RAILS_ENV'] == "production"
  ActiveSupport::Deprecation.silenced = true
end

【讨论】:

嗯..这也没有消除我的警告。 我最初忽略了上述两个 cmets 的这个答案 b/c,但实际上它确实对我有用。运行 Rails 3.2.6。 YMMV。【参考方案4】:

我发现的最佳方法记录在 here。这是假设您搜索并找到了这个问题,因为您确实拥有旧式插件。

我选择了 Make it not a gem at all 部分,因为我需要能够在我的 capistrano 部署期间根据我正在部署的应用程序的风格打开/关闭插件.在我使用 config.plugins 指定要使用的插件之前。通过这种方法,我在 config.before_configuration 上使用了“require”。

【讨论】:

+1。我最终使用Matt Coneybeare gives you a nice walkthrough 链接(在页面@yuri 链接中找到)将我的简单rails 2.3 插件转换为3.2。我喜欢这个解决方案,因为它不仅使警告静音,而且实际上修复了它们。【参考方案5】:

只需将以下猴子补丁放入/lib/silence_heroku_warnings.rb

module Rails
  class Plugin < Engine

    alias :not_silenced_initialize :initialize

    def initialize(root)
      ActiveSupport::Deprecation.silence self.send :not_silenced_initialize, root 
    end

  end
end

并在需要 Rails 之后在 config/application.rb 中使用它:

require 'rails/all'
require File.expand_path('../../lib/silence_heroku_warnings', __FILE__)

所有 2.x 风格插件的弃用都应该被禁止。将显示其他弃用。

【讨论】:

【参考方案6】:

一种比消除警告更简洁的方法,您可以这样做。

对于记录器注入,您可以尝试使用Heroku's new gem 中提到的Jared Beck his reply above。

我们所做的是:

如果您的 vendor/plugins 文件夹中有同名目录,您可以禁止 Heroku 注入自己的插件。该文件夹只需要存在。 Heroku 然后不会注入它的插件,如果没有代码,Rails 不会反对并发出弃用警告。我们只是将一个解释这一点的自述文件放入:

vendor/plugins/rails_log_stdout/readme.md

Heroku 注入日志记录插件的目的是打开 Heroku 风格的日志记录(它需要将日志发送到 STDOUT,而不是文件)。为了找回它,我们做了我在this answer 中描述的事情。无论如何,Unicorn 都需要对 Heroku 的默认行为进行调整,因此我们将两只鸟放在一块石头上。

【讨论】:

最好在 vendor/plugins/rails_log_stdout 中添加一个名为 .gitkeep 的空白文件 .gitkeep 是使用 git 时保持空目录的约定。 很公平,我更喜欢详细说明原因,这就是我喜欢自述文件方法的原因。你是对的,虽然 .gitkeep 是一个约定。【参考方案7】:

静音弃用通知的新方法是:

config.active_support.deprecation = :silence

在您的 config/environments/production.rb 文件中。

【讨论】:

也不为我禁止警告。【参考方案8】:

看来 Heroku 终于解决了这个问题。

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection

【讨论】:

以上是关于在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Procfile 在 Heroku 上禁用 Rails web dyno?

将 rails 应用程序从 3.2.3 迁移到 rails 4.0.0.rc2 后无法在 Heroku 上部署

Heroku 推送错误:“无法检测到 rake 任务”(Rails 6.1)

在 heroku 上安装 MaxMind GeoIP ruby​​ 库

heroku推送Rails 3.2应用时突然出现 "无法检测到RACK任务 "的情况(无其他错误)。

Heroku / Rails:PG :: Undefined Table:错误“[tablename]”在heroku rails迁移上不存在