Rails plugins 2.3-style dan peringatan penghentian menjalankan tugas di Heroku

155

Saya meningkatkan ke Rails 3.2, dan menjalankan rake db: migrate memberi saya beberapa kesalahan dalam formulir:

PERINGATAN DEPRECASI: Anda memiliki plugin Rails 2.3-style di vendor / plugins! Dukungan untuk plugin ini akan dihapus di Rails 4.0. Pindahkan mereka dan bundel di Gemfile Anda, atau lipat ke aplikasi Anda sebagai lib / myplugin / * dan konfigurasi / inisialisasi / myplugin.rb. Lihat catatan rilis untuk lebih lanjut tentang ini: http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released . (dipanggil dari di / app / Rakefile: 7)

Apa yang membingungkan adalah bahwa vendor/pluginsdirektori saya kosong - apakah ada direktori plugin lain yang dirujuk?

fearless_fool
sumber
1
Bahkan lebih membingungkan bagi saya karena saya TIDAK punya barang di sana, tetapi setelah menghapusnya masih ada kesalahan dari Heroku! Pertanyaan luar biasa, jawaban bagus
Phantomwhale

Jawaban:

203

Apakah Anda menggunakan Heroku?

Heroku akan menyuntikkan plugin di aplikasi Rails 3.x .. Untuk menghindari injeksi ini di Rails 3, sertakan permata rails_12factor dalam aplikasi Anda. ( Dukungan Heroku Ruby 2013-10-26)

Permata rails_12factor juga diperlukan di rel 4.

Jika permata ini tidak ada di aplikasi Anda, Anda akan menerima peringatan saat menggunakan, dan aset dan log Anda tidak akan berfungsi. ( Rails 4 di Heroku 2013-10-26)

Pada 2013-08, heroku selalu menyuntikkan plugin di aplikasi rails 3, bahkan aplikasi dengan permata yang direkomendasikan. Ini adalah masalah dengan buildpack ruby, dan diperbaiki oleh PR 11 , digabung pada 2013-08-06.

Jared Beck
sumber
1
Yap, saya menyadari bahwa semua peringatan datang dari skrip dan log Heroku saya. Saya akan berasumsi bahwa (a) itu adalah suntikan plugin dan (b) bahwa tim Heroku akan memperbaikinya sebelum menjadi masalah yang sebenarnya.
fearless_fool
Saya seorang pemula dan saya sedikit terjebak pada bagaimana saya mengedit railties-3.2.0. Tolong bantu.
Benjamin
@vezu Saya sarankan Anda tidak memulai. Ini adalah sesuatu yang dulunya umum sebelum kami mulai menggunakan bundler, tetapi saat ini sepertinya tidak berfungsi, dan mungkin akan merusak barang-barang.
Matthew Rudy
2
Saya mencoba menambahkan initializer gist.github.com/1709421 tetapi tidak berhasil (saya kira plugin dimuat lebih awal dari aplikasi initializers). Saran saya jangan khawatir ... itu hanya kebisingan.
Matthew Rudy
3
setahun kemudian ... tidak ada perubahan dari heroku.
courtimas
12

Anda dapat mencoba

::ActiveSupport::Deprecation.silenced = true

di Anda production.rbkarena hanya kebisingan.

kain
sumber
5
Idealnya seseorang hanya akan menekan peringatan khusus ini, apakah Anda tahu kalau itu mungkin?
Vincent
jika Anda melakukannya di production.rb Anda akan melihat kesalahan dalam pengembangan - jika semuanya gagal atur kebalikannya dalam development.rb
iterion
2
Tidak menekan peringatan untuk saya
Leopd
6
Satu retasan untuk menekan hanya peringatan ini adalah dengan menambahkan yang berikut ke application.rb:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav
8

di config / environment.rb tambahkan:

ActiveSupport::Deprecation.silenced = true 

sebelum menginisialisasi rel, seperti:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                               

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

Demikian pula untuk menonaktifkan peringatan dalam tugas menyapu, masukkan konfigurasi pembungkaman di dekat bagian atas Rakefile Anda:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                           

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

Anda dapat membungkus ini secara opsional dalam satu blok untuk hanya diam dalam produksi:

if ENV['RAILS_ENV'] == "production"
  ActiveSupport::Deprecation.silenced = true
end
Michael Hale
sumber
Hmm .. ini juga tidak menghapus peringatan saya.
Martin
Aku awalnya melewatkan jawaban ini b / c di atas dua komentar, tetapi sebenarnya melakukan pekerjaan untuk saya. Running Rails 3.2.6. YMMV.
Noach Magedman
4

Pendekatan terbaik yang saya temukan didokumentasikan di sini . Ini dengan asumsi Anda mencari dan menemukan pertanyaan ini karena Anda memang memiliki plugin gaya lama.

Saya menggunakan Make it bukan permata sama sekali , karena saya harus dapat mengaktifkan / menonaktifkan plugin selama pemasangan capistrano, berdasarkan citarasa aplikasi yang saya gunakan. Sebelum saya menggunakan config.plugins untuk menentukan plugin apa yang digunakan. Dengan pendekatan ini saya menggunakan "memerlukan" pada config.before_configuration sebagai gantinya.

yuяi
sumber
+1. Saya akhirnya menggunakan Matt Coneybeare memberi Anda tautan langkah-langkah bagus (ditemukan di halaman @yuri tertaut) untuk mengonversi rel sederhana saya 2,3 plugin menjadi 3,2. Saya menyukai solusi ini karena tidak hanya membungkam peringatan, tetapi juga benar-benar memperbaikinya.
Yeremia
1

Cukup masukkan tambalan monyet berikut /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

dan membutuhkannya config/application.rbhanya setelah membutuhkan Rails:

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

Semua penghentian dari plugin gaya 2.x harus dibungkam. Penghentian lainnya akan muncul.

skalee
sumber
1

Cara yang lebih bersih daripada hanya membungkam peringatan, inilah yang dapat Anda lakukan.

Untuk injeksi logger, Anda dapat mencoba menggunakan permata baru Heroku yang disebutkan Jared Beck dalam balasannya di atas .

Apa yang kami lakukan adalah sebagai berikut:

Anda dapat mencegah Heroku dari menyuntikkan plugin sendiri jika Anda memiliki direktori dengan nama yang sama di vendor/pluginsfolder Anda . Folder itu hanya perlu ada. Heroku tidak akan menyuntikkan plugin-nya, dan jika tidak ada kode, Rails tidak akan keberatan dengan peringatan penghentian. Kami baru saja meletakkan file readme yang menjelaskan hal ini ke:

vendor/plugins/rails_log_stdout/readme.md

Tujuan dari plugin Heroku yang disuntikkan untuk logging adalah untuk mengaktifkan logging gaya Heroku (membutuhkan log untuk dikirim ke STDOUT, bukan ke file). Untuk mendapatkannya kembali, kami melakukan apa yang saya jelaskan dalam jawaban ini . Tweak ke perilaku standar Heroku diperlukan untuk Unicorn, jadi kami punya dua burung dalam satu batu.

Wolfram Arnold
sumber
Lebih baik menambahkan file kosong bernama .gitkeepke vendor / plugins / rails_log_stdout .gitkeepadalah konvensi untuk menyimpan direktori kosong saat menggunakan git.
taier
Cukup adil, saya lebih suka verbositas sedikit lebih karena mengapa, itu sebabnya saya menyukai pendekatan readme. Anda benar meskipun itu .gitkeepadalah konvensi.
Wolfram Arnold
0

Cara baru untuk membungkam pemberitahuan penghentian adalah:

config.active_support.deprecation = :silence

dalam config/environments/production.rbfile Anda .

Jonathan Métillon
sumber
3
Juga tidak menekan peringatan untuk saya.
Leopd
0

Sepertinya Heroku akhirnya membahas ini.

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