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

时间:2012-01-27 00:14:42

标签: ruby-on-rails heroku ruby-on-rails-plugins

我正在升级到Rails 3.2,运行rake db:migrate会给我带来几个错误:

  

弃用警告:您在供应商/插件中拥有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目录是空的 - 是否有另一个引用的插件目录?

8 个答案:

答案 0 :(得分:203)

你在使用Heroku吗?

  

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

rails 4中也需要rails_12factor gem。

  

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

就在2013-08赛季,heroku总是在rails 3应用程序中注入插件,甚至包含推荐宝石的应用程序。这是ruby buildpack的一个问题,由PR 11修复,并于2013-08-06合并。

答案 1 :(得分:12)

你可以尝试

::ActiveSupport::Deprecation.silenced = true

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

答案 2 :(得分:7)

在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

答案 3 :(得分:4)

我发现的最佳方法是here。这是假设您搜索并发现此问题,因为您执行具有旧式插件。

我选择使它不是一个宝石部分,因为我需要能够在我的capistrano部署期间根据我正在部署的应用程序的风格打开/关闭插件。在我使用config.plugins指定要使用的插件之前。通过这种方法,我在config.before_configuration上使用了“require”。

答案 4 :(得分:1)

将以下猴子补丁放入/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样式插件的所有弃用都应该是静音的。其他弃用将出现。

答案 5 :(得分:1)

这是一种更清洁的方式,而不仅仅是沉默警告,这是你可以做的。

对于记录器注入,您可以尝试使用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中描述的内容。无论如何,对于独角兽来说,需要对Heroku的默认行为进行调整,所以我们一石二鸟。

答案 6 :(得分:0)

隐藏弃用通知的新方法是:

config.active_support.deprecation = :silence

config/environments/production.rb文件中。

答案 7 :(得分:0)

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

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