Plug-ins do Rails 2.3 e avisos de descontinuação executando a tarefa no Heroku


155

Estou atualizando para o Rails 3.2 e executando o rake db: migrate me dá vários erros do formulário:

AVISO DE DEPRECAÇÃO: Você possui plugins do Rails 2.3 no fornecedor / plugins! O suporte para esses plug-ins será removido no Rails 4.0. Mova-os para fora e agrupe-os no seu Gemfile ou dobre-os no seu aplicativo como lib / myplugin / * e config / initializers / myplugin.rb. Veja as notas de versão para mais informações sobre o assunto: http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released . (chamado em / app / Rakefile: 7)

O que é desconcertante é que meu vendor/pluginsdiretório está vazio - existe outro diretório de plugins ao qual está fazendo referência?


1
Foi ainda mais desconcertante para mim, pois eu tinha coisas lá, mas depois de removê-lo ainda continuava o erro do Heroku! Ótima pergunta, ótima resposta
Phantomwhale

Respostas:


203

Você está usando o Heroku?

O Heroku injeta plug-ins nos aplicativos do Rails 3.x. Para evitar essa injeção no Rails 3, inclua a gema rails_12factor em seu aplicativo. ( Suporte ao Heroku Ruby 26/10/2013)

A gema rails_12factor também é necessária nos trilhos 4.

Se essa gema não estiver presente no seu aplicativo, você receberá um aviso durante a implantação e seus ativos e logs não funcionarão. ( Rails 4 no Heroku 26/10/2013)

Em 2013-08, o heroku sempre injetava plugins em aplicativos rails 3, mesmo aplicativos com as gemas recomendadas. Esse foi um problema com o ruby ​​buildpack e foi corrigido pelo PR 11 , mesclado em 06/08/2013.


1
Sim, percebo que todos os avisos vieram dos meus scripts e logs do Heroku. Assumirei que (a) são as injeções de plugins e (b) que a equipe Heroku consertará isso antes que se torne um problema real.
Fearless_fool

Eu sou um novato e estou um pouco preso em como eu edito railties-3.2.0. Você pode por favor ajudar.
Benjamin

@vezu Eu recomendo que você não comece. Isso era algo que costumava ser comum antes de começarmos a usar o empacotador, mas, no momento, é improvável que funcione e provavelmente quebrará tudo.
Matthew Rudy

2
Tentei adicionar um inicializador gist.github.com/1709421, mas ele não funciona (acho que os plugins são carregados antes dos inicializadores de aplicativos). Minha sugestão é não se preocupe ... é apenas barulho.
Matthew Rudy

3
um ano depois ... nenhuma mudança em relação ao heroku.
Tribunais

12

Podes tentar

::ActiveSupport::Deprecation.silenced = true

no seu production.rbdesde que é apenas barulho.


5
O ideal seria suprimir esse aviso em particular, você sabe se isso é possível?
Vincent

se você fizer isso em production.rb você deve ver os erros no desenvolvimento - se tudo mais falhar definir o oposto em development.rb
iterion

2
Não suprimir os avisos para mim
Leopd

6
Um truque para suprimir apenas esse aviso é adicionar o seguinte ao application.rb:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav

8

em config / environment.rb adicione:

ActiveSupport::Deprecation.silenced = true 

antes de inicializar os trilhos, assim:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                               

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

Da mesma forma, para desativar os avisos nas tarefas de rake, insira a configuração de silenciamento na parte superior do seu Rakefile:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                           

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

Opcionalmente, você pode agrupar isso em um bloco para silenciar apenas na produção:

if ENV['RAILS_ENV'] == "production"
  ActiveSupport::Deprecation.silenced = true
end

Hmm .. isso também não removeu meu aviso.
Martin

I inicialmente passou-se esta resposta b / c do acima de dois comentários, mas na verdade fez o trabalho para mim. Rodando Rails 3.2.6. YMMV.
Noach Magedman

4

A melhor abordagem que encontrei está documentada aqui . Isso supõe que você procurou e encontrou esta pergunta porque você fazer tem plugins de estilo antigo.

Fui com o Make it não é uma joia em tudo , porque precisava ativar / desativar os plug-ins durante a implantação do capistrano, com base no sabor do aplicativo que estava implantando. Antes de usar o config.plugins para especificar qual plug-in usar. Com essa abordagem, estou usando um "require" no config.before_configuration.


+1. Acabei usando o Matt Coneybeare, que oferece um link passo a passo (encontrado na página @yuri linked) para converter meus plugins Rails 2.3 simples em 3.2. Gostei desta solução porque não apenas silenciou os avisos, mas também os corrigiu.
Jeremiah

1

Basta colocar o seguinte patch de macaco em /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

e exigi-lo config/application.rblogo após a solicitação do Rails:

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

Todas as preterições dos plugins no estilo 2.x devem ser silenciadas. Outras preterições aparecerão.


1

Uma maneira mais limpa do que apenas silenciar avisos, eis o que você pode fazer.

Para a injeção do logger, você pode tentar usar a nova gema de Heroku que Jared Beck mencionou em sua resposta acima .

Em vez disso, fizemos o seguinte:

Você pode impedir o Heroku de injetar seus próprios plug-ins se você tiver um diretório com o mesmo nome na sua vendor/pluginspasta. A pasta só precisa existir. O Heroku não injeta seu plug-in e, se não houver código, o Rails não se oporá a avisos de descontinuação. Apenas colocamos um arquivo leia-me explicando isso em:

vendor/plugins/rails_log_stdout/readme.md

O objetivo do plug-in injetado do Heroku para log é ativar o log no estilo Heroku (requer que os logs sejam enviados para STDOUT, não para um arquivo). Para recuperar isso, fizemos o que descrevi nesta resposta . De qualquer maneira, eram necessários ajustes nos comportamentos padrão de Heroku para o Unicorn, então conseguimos dois pássaros em uma pedra.


Melhor adicionar um arquivo em branco chamado .gitkeepvendor / plugins / rails_log_stdout .gitkeepé uma convenção para manter um diretório vazio ao usar o git.
Tmaier

É justo, prefiro um pouco mais de detalhamento do motivo, por isso gostei da abordagem leia-me. Você está certo, porém, que .gitkeepé uma convenção.
Wolfram Arnold

0

A nova maneira de silenciar os avisos de descontinuação é:

config.active_support.deprecation = :silence

no seu config/environments/production.rbarquivo.


3
Também não suprimindo os avisos para mim.
Leopd

0

Parece que Heroku finalmente resolveu isso.

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.