Complementos estilo Rails 2.3 y advertencias de desaprobación ejecutando tareas en Heroku

155

Estoy actualizando a Rails 3.2 y ejecutando rake db: migrate me da varios errores de la forma:

ADVERTENCIA DE DEPRECACIÓN: ¡Tiene complementos de estilo Rails 2.3 en proveedores / complementos! El soporte para estos complementos se eliminará en Rails 4.0. Moverlos y agruparlos en su Gemfile, o plegarlos en su aplicación como lib / myplugin / * y config / initializers / myplugin.rb. Consulte las notas de la versión para obtener más información al respecto: http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released . (llamado desde at / app / Rakefile: 7)

Lo desconcertante es que mi vendor/pluginsdirectorio está vacío: ¿hay otro directorio de complementos al que hace referencia?

temerario
fuente
1
Fue aún más desconcertante para mí, ya que tenía cosas allí, pero después de eliminarlo, ¡el error de Heroku! Gran pregunta, gran respuesta
Phantomwhale

Respuestas:

203

¿Estás usando Heroku?

Heroku inyectará complementos en aplicaciones Rails 3.x .. Para evitar esta inyección en Rails 3, incluya la gema rails_12factor en su aplicación. ( Soporte Heroku Ruby 2013-10-26)

La gema rails_12factor también se requiere en los rieles 4.

Si esta gema no está presente en su aplicación, recibirá una advertencia durante la implementación y sus activos y registros no funcionarán. ( Rieles 4 en Heroku 2013-10-26)

Tan recientemente como 2013-08, heroku siempre inyectó complementos en rails 3 aplicaciones, incluso aplicaciones con las gemas recomendadas. Este era un problema con el paquete de compilación ruby, y fue corregido por PR 11 , fusionado el 2013-08-06.

Jared Beck
fuente
1
Sí, me doy cuenta de que todas las advertencias provienen de mis guiones y registros de Heroku. Asumiré que (a) son las inyecciones de complementos y (b) que el equipo de Heroku solucionará esto antes de que se convierta en un problema real.
fearless_fool
Soy un novato y estoy un poco atascado en cómo edito railties-3.2.0. ¿Puedes por favor ayudarme?
Benjamin
@vezu te recomiendo que no comiences. Esto era algo que solía ser común antes de comenzar a usar el bundler, pero en este momento es poco probable que funcione, y probablemente solo rompa cosas.
Matthew Rudy el
2
Intenté agregar un inicializador gist.github.com/1709421 pero no funciona (supongo que los complementos se cargan antes que los inicializadores de la aplicación). Mi sugerencia es no te preocupes ... es solo ruido.
Matthew Rudy el
3
un año después ... no hay cambio de heroku.
courtimas
12

Puedes probar

::ActiveSupport::Deprecation.silenced = true

en tu production.rbya que es solo ruido.

kain
fuente
55
Idealmente, uno solo suprimiría esta advertencia en particular, ¿sabe si eso es posible?
Vincent
si lo hace en production.rb, debería ver los errores en el desarrollo; si todo lo demás falla, configure lo contrario en development.rb
iterion
2
No suprimir las advertencias para mí
Leopd 01 de
66
Un truco para suprimir solo esta advertencia es agregar lo siguiente a application.rb:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav
8

en config / environment.rb agregar:

ActiveSupport::Deprecation.silenced = true 

antes de inicializar los rieles, así:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                               

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

De manera similar, para desactivar las advertencias en las tareas de rake, inserte la configuración de silenciamiento cerca de la parte superior de su Rakefile:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                           

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

Opcionalmente, puede envolver esto en un bloque para silenciar solo en producción:

if ENV['RAILS_ENV'] == "production"
  ActiveSupport::Deprecation.silenced = true
end
Michael Hale
fuente
Hmm ... esto tampoco eliminó mi advertencia.
Martin
Al principio me dejó pasar esta respuesta b / c de los anteriores dos comentarios, pero, de hecho, hice el trabajo para mí. Running Rails 3.2.6. YMMV.
Noach Magedman
4

El mejor enfoque que he encontrado está documentado aquí . Esto es suponiendo que buscado y encontrado esta pregunta porque hacer que los plugins de estilo antiguo.

Fui con Make it not a joya en absoluto , porque necesitaba poder activar / desactivar los complementos durante mi implementación de capistrano, según el sabor de la aplicación que estaba implementando. Antes de usar config.plugins para especificar qué complemento usar. Con este enfoque estoy usando un "require" en config.before_configuration en su lugar.

yuяi
fuente
+1. Terminé usando el Matt Coneybeare que le brinda un buen enlace de recorrido (que se encuentra en la página @yuri enlazada) para convertir mis complementos simples de rails 2.3 a 3.2. Me gustó esta solución porque no solo silenció las advertencias, sino que las solucionó.
Jeremías
1

Solo pon el siguiente parche de mono en /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

y requerirlo config/application.rbjusto después de requerir Rails:

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

Todas las degradaciones de los complementos de estilo 2.x deben silenciarse. Aparecerán otras degradaciones.

skalee
fuente
1

Una forma más limpia que simplemente silenciar las advertencias, esto es lo que puede hacer.

Para la inyección del registrador, puede intentar usar la nueva gema de Heroku que Jared Beck mencionó en su respuesta anterior .

Lo que hicimos en su lugar es esto:

Puede inhibir que Heroku inyecte sus propios complementos si tiene un directorio con el mismo nombre en su vendor/pluginscarpeta. La carpeta solo necesita existir. Heroku no inyectará su complemento, y si no hay código, Rails no se opondrá con advertencias de desaprobación. Acabamos de poner un archivo Léame que explica esto en:

vendor/plugins/rails_log_stdout/readme.md

El propósito del complemento inyectado de Heroku para el registro es activar el registro al estilo de Heroku (requiere que los registros se envíen a STDOUT, no a un archivo). Para recuperar eso, hicimos lo que describí en esta respuesta . Los ajustes a los comportamientos predeterminados de Heroku eran necesarios para Unicornio de todos modos, por lo que obtuvimos dos pájaros de un tiro.

Wolfram Arnold
fuente
Mejor agregar un archivo en blanco llamado .gitkeepvendor / plugins / rails_log_stdout .gitkeepes una convención para mantener un directorio vacío cuando se usa git.
tmaier
Justo, prefiero un poco más de verbosidad en cuanto a por qué, es por eso que me gustó el enfoque de léame. Tienes razón, aunque eso .gitkeepes una convención.
Wolfram Arnold
0

La nueva forma de silenciar los avisos de desaprobación es:

config.active_support.deprecation = :silence

en tu config/environments/production.rbarchivo

Jonathan Métillon
fuente
3
Tampoco suprimir las advertencias para mí.
Leopd
0

Parece que Heroku finalmente ha abordado esto.

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