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


155

我正在升级到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目录为空-是否正在引用另一个插件目录?


1
因为我在那里有东西,对我来说更是令人困惑,但是删除它后,仍然出现Heroku的错误!很好的问题,很好的答案
幻影鲸

Answers:


203

您在使用Heroku吗?

Heroku将在Rails 3.x应用程序中插入插件。为了避免在Rails 3中进行这种注入,请在应用程序中包含rails_12factor gem。( Heroku Ruby支持 2013-10-26)

rails 4中也需要rails_12factor gem。

如果您的应用程序中不存在该gem,则在部署时会收到警告,并且您的资产和日志将不起作用。(Heroku上的Rails 4 2013-10-26)

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


1
是的,我意识到所有警告均来自我的Heroku脚本和日志。我假设(a)是插件注入,(b)Heroku团队将在它成为实际问题之前对其进行修复。
fearless_fool 2012年

我是一个新手,我对如何编辑railties-3.2.0有点困惑。你能帮忙吗?
本杰明

@vezu我建议您不要开始。在我们开始使用捆绑程序之前,这曾经很普遍,但是现在它不太可能起作用,并且可能会破坏东西。
马修·鲁迪

2
我尝试添加一个初始化程序gist.github.com/1709421,但是它不起作用(我猜插件的加载早于应用程序初始化程序)。我的建议是不用担心...只是噪音。
马修·鲁迪

3
一年后... heroku没变化。
courtsimas

12

你可以试试

::ActiveSupport::Deprecation.silenced = true

在你里面,production.rb因为那只是噪音。


5
理想情况下,只会抑制这一特定警告,您知道是否可能?
文森特2012年

如果您在production.rb中执行此操作,则应该看到开发中的错误-如果所有其他操作都失败,
则会

2
不抑制我的警告
Leopd 2012年

6
抑制此警告的一种方法是在application.rb中添加以下内容:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav 2013年

8

在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

嗯..这也没有消除我的警告。
马丁

我最初传上去的这个答案B / C以上两种意见,但实际上的工作对我来说。运行Rails 3.2.6。YMMV。
Noach Magedman

4

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

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


+1。我最终使用了Matt Coneybeare,为您提供了一个不错的演练链接(在@yuri链接页面中找到),可以将我简单的rails 2.3插件转换为3.2。我喜欢此解决方案,因为它不仅可以消除警告,还可以修复警告。
耶利米2013年

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

config/application.rb在需要Rails之后立即要求它:

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

对来自2.x样式插件的所有弃用均应保持沉默。其他弃用将出现。


1

这不仅仅是使警告静音的一种更清洁的方法,这就是您可以做的。

对于注射记录器,你可以尝试使用Heroku的新宝石贾里德贝克提到他的上述答复

相反,我们所做的是:

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

vendor/plugins/rails_log_stdout/readme.md

Heroku注入的用于日志记录的插件的目的是打开Heroku样式的日志记录(它要求将日志发送到STDOUT,而不是文件)。为了得到答案,我们做了我在这个答案中描述的事情。无论如何,独角兽都需要调整Heroku的默认行为,因此我们在一块石头上养了两只鸟。


最好添加一个名为.gitkeepvendor / plugins / rails_log_stdout 的空白文件,这 .gitkeep是在使用git时保留一个空目录的约定。
tmaier

公平地说,为什么我更详细,这就是为什么我喜欢自述方法。你是对的,尽管那.gitkeep是惯例。
Wolfram Arnold

0

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

config.active_support.deprecation = :silence

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


3
也不要抑制我的警告。
Leopd 2012年

0

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

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.