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


155

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


1
Было еще более запутанным для меня, так как у меня были вещи там, но после удаления все еще идет ошибка от Heroku! Отличный вопрос, отличный ответ
— Призрачный кит

Ответы:


203

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

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

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

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

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


1
Да, я понимаю, что все предупреждения пришли из моих скриптов и журналов Heroku. Я предполагаю, что (а) это инъекции плагинов и (б) что команда Heroku исправит это, прежде чем это станет реальной проблемой.
— fearless_fool

Я новичок, и я немного застрял в том, как я редактирую Railties-3.2.0. Не могли бы вы помочь.
— Бенджамин

@vezu Я рекомендую тебе не начинать. Это было то, что раньше было обычным делом, прежде чем мы начали использовать bundler, но сейчас это вряд ли сработает и, вероятно, просто сломает материал.
— Мэтью Руди

2
Я попытался добавить инициализатор gist.github.com/1709421, но он не работает (я думаю, плагины загружаются раньше, чем инициализаторы приложений). Мое предложение не волнуйтесь ... это просто шум.
— Мэтью Руди

3
через год ... без изменений геройку.
— Courtimas

12

Можешь попробовать

::ActiveSupport::Deprecation.silenced = true

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


5
В идеале можно было бы только подавить это конкретное предупреждение. Знаете ли вы, возможно ли это?
— Винсент

если вы делаете это в production.rb, вы должны увидеть ошибки в разработке - если
— ничего не помогает,

2
Не подавляя предупреждения для меня
— Леопд

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

Хм .. это тоже не сняло мое предупреждение.
— Мартин

Первоначально я пропустил этот ответ в ответ на два вышеупомянутых комментария, но на самом деле он мне помог. Ходовые рельсы 3.2.6. YMMV.
— Ноах Магедман

4

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

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


+1. Я закончил тем, что с помощью Matt Coneybeare вы получите красивую ссылку для прохождения (на странице @yuri link), чтобы конвертировать мои простые плагины rails 2.3 в 3.2. Мне понравилось это решение, потому что оно не просто заставляет замолчать предупреждения, оно фактически исправляет их.
— Иеремия

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.rbсразу после того, как требуется Rails:

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

Все устаревшие плагины в стиле 2.x должны быть отключены. Другие амортизации появятся.


1

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

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

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

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

vendor/plugins/rails_log_stdout/readme.md

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


Лучше добавить пустой файл с именем .gitkeepvendor / plugins / rails_log_stdout .gitkeep- это соглашение о том, чтобы при использовании git хранить пустой каталог.
— tmaier

Справедливости ради, я предпочитаю немного больше подробностей о том, почему, поэтому мне понравился подход readme. Вы правы, хотя .gitkeepэто соглашение.
— Вольфрам Арнольд

0

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

config.active_support.deprecation = :silence

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


3
Также не подавляя предупреждения для меня.
— Леопд

0

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

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.