Rails-Plugins im 2.3-Stil und Warnungen vor Verfall, die in Heroku ausgeführt werden

155

Ich aktualisiere auf Rails 3.2 und wenn ich rake db: migrate ausführe, bekomme ich mehrere Fehler in der folgenden Form:

DEPRECATION WARNING: Sie haben Rails 2.3-Plugins in Hersteller / Plugins! Die Unterstützung für diese Plugins wird in Rails 4.0 entfernt. Verschieben Sie sie heraus und bündeln Sie sie in Ihrer Gemfile oder falten Sie sie als lib / myplugin / * und config / initializers / myplugin.rb in Ihre App. Weitere Informationen hierzu finden Sie in den Versionshinweisen: http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released . (aufgerufen von at / app / Rakefile: 7)

Was verwirrend ist, ist, dass mein vendor/pluginsVerzeichnis leer ist - gibt es ein anderes Plugins-Verzeichnis, auf das es verweist?

furchtloser Dummkopf
quelle
1
War für mich noch vorbereitender, da ich dort Sachen hatte, aber nach dem Entfernen geht immer noch der Fehler von Heroku! Tolle Frage, tolle Antwort
Phantomwal

Antworten:

203

Benutzt du Heroku?

Heroku injiziert Plugins in Rails 3.x-Anwendungen. Um diese Injektion in Rails 3 zu vermeiden, fügen Sie den Rails_12-Faktor in Ihre Anwendung ein. ( Heroku Ruby Support 2013-10-26)

Der Rails_12-Faktor-Edelstein wird auch in Rails 4 benötigt.

Wenn dieses Juwel in Ihrer Anwendung nicht vorhanden ist, erhalten Sie während der Bereitstellung eine Warnung, und Ihre Assets und Protokolle sind nicht funktionsfähig. ( Schienen 4 auf Heroku 26.10.2013)

Noch 2013-08 hat Heroku Plugins in Rails 3-Apps eingefügt, sogar in Apps mit den empfohlenen Edelsteinen. Dies war ein Problem mit dem Ruby Buildpack und wurde durch PR 11 behoben , das am 06.08.2013 zusammengeführt wurde.

Jared Beck
quelle
1
Ja, mir ist klar, dass alle Warnungen von meinen Heroku-Skripten und -Protokollen stammen. Ich gehe davon aus, dass (a) es sich um die Plugin-Injektionen handelt und (b) das Heroku-Team dies behebt, bevor es zu einem tatsächlichen Problem wird.
Furchtloser_Narr
Ich bin ein Neuling und ich bin ein wenig festgefahren, wie ich railties-3.2.0 bearbeite. Können Sie bitte helfen.
Benjamin
@vezu Ich empfehle dir nicht anzufangen. Dies war etwas, das früher üblich war, bevor wir anfingen, Bundler zu verwenden, aber im Moment ist es unwahrscheinlich, dass es funktioniert, und es wird wahrscheinlich nur Dinge kaputt machen.
Matthew Rudy
2
Ich habe versucht, einen Initialisierer hinzuzufügen. Gist.github.com/1709421, aber es funktioniert nicht (ich denke, Plugins werden früher als App-Initialisierer geladen). Mein Vorschlag ist, keine Sorge ... es ist nur Lärm.
Matthew Rudy
3
ein Jahr später ... keine Veränderung gegenüber Heroku.
Courtsimas
12

Du kannst es versuchen

::ActiveSupport::Deprecation.silenced = true

in deinem production.rbda ist es nur lärm.

kain
quelle
5
Im Idealfall würde man diese spezielle Warnung nur unterdrücken. Wissen Sie, ob dies möglich ist?
Vincent
Wenn Sie es in Production.rb tun, sollten Sie die Fehler in der Entwicklung sehen - wenn alles andere fehlschlägt, setzen Sie das Gegenteil in Development.rb
Iteration
2
Die Warnungen für mich nicht unterdrücken
Leopd
6
Ein Hack, um nur diese Warnung zu unterdrücken, besteht darin, application.rb Folgendes hinzuzufügen:ActiveSupport::Deprecation.behavior = Proc.new { |msg, stack| $stderr.puts msg unless msg =~ /You have Rails 2.3-style plugins/ }
Liron Yahdav
8

in config / environment.rb hinzufügen:

ActiveSupport::Deprecation.silenced = true 

vor dem Initialisieren von Schienen wie folgt:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                               

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

Um Warnungen in Rake-Tasks zu deaktivieren, fügen Sie die Silencing-Konfiguration oben in Ihr Rakefile ein:

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

ActiveSupport::Deprecation.silenced = true                                                                                                                           

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

Sie können dies optional in einen Block einschließen, um nur die Produktion zum Schweigen zu bringen:

if ENV['RAILS_ENV'] == "production"
  ActiveSupport::Deprecation.silenced = true
end
Michael Hale
quelle
Hmm .. das hat auch meine Warnung nicht entfernt.
Martin
Ich zunächst diese Antwort b / c der beiden oben genannten Kommentare bestanden, aber es tatsächlich tat Arbeit für mich. Laufschienen 3.2.6. YMMV.
Noach Magedman
4

Der beste Ansatz, den ich gefunden habe, ist hier dokumentiert . Dies wird vorausgesetzt , Sie haben gesucht und diese Frage gefunden , weil Sie tun im alten Stil Plugins.

Ich habe mich für Make it not a gem entschieden , da ich Plugins während meiner Capistrano-Bereitstellung ein- und ausschalten musste, je nachdem, welche Art von App ich bereitstellte. Bevor ich config.plugins verwendet habe, um anzugeben, welches Plugin verwendet werden soll. Bei diesem Ansatz verwende ich stattdessen ein "require" für config.before_configuration.

yuяi
quelle
+1. Am Ende habe ich Matt Coneybeare verwendet , um einen einfachen Walkthrough- Link (auf der Seite @yuri verlinkt) zu finden, mit dem ich meine einfachen Rails 2.3-Plugins in 3.2 konvertieren kann. Ich mochte diese Lösung, weil sie die Warnungen nicht nur zum Schweigen brachte, sondern sie tatsächlich behebt.
Jeremiah
1

Legen Sie einfach den folgenden Affen-Patch hinein /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

und fordern Sie es in config/application.rbgleich nach der Anforderung von Rails:

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

Alle Abwertungen von Plugins im 2.x-Stil sollten stummgeschaltet werden. Andere Abschreibungen werden angezeigt.

Skalee
quelle
1

Dies ist eine sauberere Methode, als nur Warnungen zum Schweigen zu bringen.

Für die Logger-Injektion können Sie versuchen, Herokus neues Juwel zu verwenden , das Jared Beck in seiner obigen Antwort erwähnt hat .

Was wir stattdessen getan haben, ist Folgendes:

Sie können Heroku daran hindern, eigene Plugins einzufügen, wenn sich in Ihrem vendor/pluginsOrdner ein gleichnamiges Verzeichnis befindet . Der Ordner muss nur existieren. Heroku injiziert dann sein Plugin nicht und wenn es keinen Code gibt, wird Rails keine Einwände gegen Verfallswarnungen erheben. Wir haben gerade eine Readme-Datei eingefügt, die dies erklärt:

vendor/plugins/rails_log_stdout/readme.md

Der Zweck von Herokus injiziertem Plugin für die Protokollierung besteht darin, die Protokollierung im Heroku-Stil zu aktivieren (Protokolle müssen an STDOUT und nicht an eine Datei gesendet werden). Um das zurückzubekommen, haben wir das getan, was ich in dieser Antwort beschrieben habe . Für Unicorn waren ohnehin Änderungen an Herokus Standardverhalten erforderlich, sodass wir zwei Fliegen in einer Klappe hatten.

Wolfram Arnold
quelle
.gitkeepFügen Sie besser eine leere Datei mit dem Namen vendor / plugins / rails_log_stdout hinzu. Dies .gitkeepist eine Konvention, um bei Verwendung von git ein leeres Verzeichnis beizubehalten .
Tmaier
Fairerweise bevorzuge ich etwas mehr Ausführlichkeit, warum, deshalb mochte ich den Readme-Ansatz. Sie haben Recht, obwohl das .gitkeepeine Konvention ist.
Wolfram Arnold
0

Die neue Methode zum Stummschalten von Verfallsbenachrichtigungen lautet:

config.active_support.deprecation = :silence

in Ihrer config/environments/production.rbDatei.

Jonathan Métillon
quelle
3
Auch die Warnungen für mich nicht unterdrücken.
Leopd
0

Es sieht so aus, als hätte Heroku dies endlich angesprochen.

   Injecting plugin 'rails_log_stdout'
   Injecting plugin 'rails3_serve_static_assets'
   Add 'rails_12factor' gem to your Gemfile to skip plugin injection
Raidfive
quelle