Плагины в стиле 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.