Rails 2.3スタイルのプラグインと非推奨の警告がHerokuでタスクを実行している


155

Rails 3.2にアップグレードしています。rakedb: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からエラーが発生しました!すばらしい質問、すばらしい答え
ファントムホエール

回答:


203

Herokuを使用していますか?

HerokuはプラグインをRails 3.xアプリケーションにインジェクトします。Rails3でこのインジェクションを回避するには、アプリケーションにrails_12factor gemを含めます。(Heroku Rubyサポート 2013-10-26)

rails_12factor gemはrails 4でも必要です。

このgemがアプリケーションに存在しない場合、デプロイ中に警告が表示され、アセットとログが機能しなくなります。(Heroku 2013-10-26のRails 4

最近の2013-08年には、herokuは常にプラグインをRails 3アプリに挿入しました。これはrubyビルドパックの問題であり、PR 11で修正され、2013-08-06にマージされました。


1
はい、私はすべての警告が私のHerokuスクリプトとログからのものであることを理解しています。(a)プラグインのインジェクションであり、(b)Herokuチームが実際の問題になる前にこれを修正することを前提としています。
fearless_fool 2012年

私は初心者ですが、私はrailties-3.2.0の編集方法に少しこだわっています。手伝ってくれませんか。
ベンジャミン

@vezu開始しないことをお勧めします。これは、Bundlerの使用を開始する前は一般的でしたが、現在は機能しない可能性があり、おそらく問題が発生するだけです。
マシュールディ

2
イニシャライザgist.github.com/1709421を追加しようとしましたが、機能しません(アプリのイニシャライザより前にプラグインがロードされていると思います)。私の提案は心配しないでください...ただのノイズです。
マシュールディ

3
1年後... herokuから変更はありません。
2013

12

あなたが試すことができます

::ActiveSupport::Deprecation.silenced = true

あなたにproduction.rbそれだけでノイズのだから。


5
理想的には、この特定の警告のみを抑制することができますが、それが可能かどうか知っていますか?
ビンセント、

production.rbでそれを行うと、開発でエラーが表示されるはずです-他のすべてが失敗した場合、
developer.rbで

2
私への警告を抑制しない
Leopd

6
抑制するために一つのハックちょうどこの警告はapplication.rbに以下を追加することです:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav

8

config / environment.rbに追加:

ActiveSupport::Deprecation.silenced = true 

次のようにレールを初期化する前:

# 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

うーん..これでも私の警告は消えませんでした。
マーティン

私は最初に上記の2つのコメントのこの回答b / cを渡しましたが、実際にそれでうまくいきました。Railsの実行3.2.6。YMMV。
Noach Magedman

4

私が見つけた最良のアプローチはここに文書化されています。古いスタイルのプラグインがあるため、この質問を検索して見つけたと想定ています。

私が開発したアプリのフレーバーに基づいて、カピストラーノの展開中にプラグインをオン/オフにできるようにする必要があったため、私はすべての部分をGemではないようにしました。以前は、config.pluginsを使用して、使用するプラグインを指定していました。このアプローチでは、代わりにconfig.before_configurationで「必須」を使用しています。


+1。私は結局マットコニーベアーを使用して、私のシンプルなレール2.3プラグインを3.2に変換するための素晴らしいウォークスルーリンク(@yuriリンクされたページにあります)を提供します。警告を黙らせるだけでなく、実際にそれらを修正するので、私はこのソリューションが好きでした。
エレミヤ

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.rbRails を要求した直後にそれを要求します:

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

2.xスタイルのプラグインからのすべての非推奨は沈黙する必要があります。他の廃止予定が表示されます。


1

警告を止めるだけの方法よりもきれいな方法を以下に示します。

ロガーインジェクションでは、Jared Beckが上記の返信で言及しHerokuの新しい宝石を使用してみることができます。

代わりに、これは次のとおりです。

vendor/pluginsフォルダーに同じ名前のディレクトリがある場合、Herokuが独自のプラグインを挿入しないようにすることができます。フォルダーが存在する必要があります。その後、Herokuはプラグインを挿入しません。コードがない場合、Railsは非推奨の警告を出さずに拒否します。これを説明するreadmeファイルを次の場所に配置します。

vendor/plugins/rails_log_stdout/readme.md

ログに挿入するHerokuのプラグインの目的は、Herokuスタイルのログをオンにすることです(ログをファイルではなくSTDOUTに送信する必要があります)。それを取り戻すために、私はこの回答で説明したことを行いました。いずれにしても、ユニコーンにはHerokuのデフォルトの動作を微調整する必要があったため、1石に2羽の鳥を入れました。


gitを使用する場合、.gitkeepvendor / plugins / rails_log_stdout という名前の空のファイルを追加することをお勧めします .gitkeep
tmaier 2013

結局のところ、私は理由についてもう少し詳細を好むので、Readmeアプローチが好きでした。それ.gitkeepは慣習ですが、あなたは正しいです。
Wolfram Arnold

0

サポート終了の通知を抑制する新しい方法は次のとおりです。

config.active_support.deprecation = :silence

あなたの中config/environments/production.rbのファイル。


3
また、警告を抑制していません。
Leopd

0

Herokuがついにこれに対処したようです。

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.