Плагины в стиле Rails 2.3 и предупреждения об устаревании, запущенные в Heroku - PullRequest
155 голосов
/ 27 января 2012

Я обновляюсь до 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 пуст - есть ли другой каталог плагинов, на который он ссылается?

Ответы [ 8 ]

203 голосов
/ 28 января 2012

Вы используете Heroku?

Heroku внедрит плагины в приложения Rails 3.x. Чтобы избежать этого впрыск в Rails 3, включите в свой гем rails_12factor приложение. ( Поддержка Heroku Ruby 2013-10-26)

Камень rails_12factor также требуется в рельсах 4.

Если этот драгоценный камень отсутствует в вашем приложении, вы получите предупреждение при развертывании, и ваши активы и журналы не будут функциональны. ( Рельсы 4 на Heroku 2013-10-26)

Еще в 2013-08 году heroku всегда вставлял плагины в приложения rails 3, даже в приложения с рекомендованными гемами. Эта проблема была связана с пакетом сборки ruby ​​и была исправлена ​​в PR 11 , объединенном 2013-08-06.

12 голосов
/ 14 февраля 2012

Вы можете попробовать

::ActiveSupport::Deprecation.silenced = true

в вашем production.rb, так как это просто шум.

7 голосов
/ 04 июня 2012

в 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, вставьте конфигурацию глушителей вверхувашего рейк-файла:

# 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
4 голосов
/ 22 мая 2012

Лучший подход, который я нашел, задокументирован здесь . Предполагается, что вы искали и нашли этот вопрос, потому что у вас есть плагины старого стиля.

Я пошел с Сделать его совсем не драгоценным , потому что мне нужно было включать / выключать плагины во время моего развертывания в Capistrano, в зависимости от того, какое приложение я развертывал. Ранее я использовал config.plugins, чтобы указать, какой плагин использовать. При таком подходе я вместо этого использую «require» в config.before_configuration.

1 голос
/ 17 июля 2013

Более чистый способ, чем просто отключение предупреждений, вот что вы можете сделать.

Для инъекции в логгер вы можете попробовать использовать Новый драгоценный камень Heroku , который Джаред Бек упомянутый в его ответ выше .

Вместо этого мы сделали следующее:

Вы можете запретить Heroku вводить свои собственные плагины, если в папке vendor/plugins есть каталог с таким же именем.Папка просто должна существовать.Тогда Heroku не будет вставлять свой плагин, и если кода нет, Rails не будет возражать с предупреждениями об устаревании.Мы просто поместили файл readme, объясняющий это, в:

vendor/plugins/rails_log_stdout/readme.md

Цель внедренного плагина Heroku для ведения журнала - включить ведение журнала в стиле Heroku (требуется, чтобы журналы отправлялись в STDOUT, а не в файл),Чтобы вернуть это, мы сделали то, что я описал в этом ответе .В любом случае, Юникорну нужно было настроить поведение Heroku по умолчанию, поэтому мы получили двух зайцев в одном камне.

1 голос
/ 08 мая 2013

Просто поместите следующий патч обезьяны в /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 должны быть отключены. Другие устаревшие будут отображаться.

0 голосов
/ 29 августа 2013

Похоже, что Heroku наконец-то решил эту проблему.

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
0 голосов
/ 16 мая 2012

Новый способ отключения уведомлений об устаревании:

config.active_support.deprecation = :silence

в файле config/environments/production.rb.

...