Ich habe eine meiner Apps von Rails 4.2.6 auf Rails 5.0.0 aktualisiert. Im Upgrade-Handbuch heißt es, dass die Autoload-Funktion jetzt in der Produktion standardmäßig deaktiviert ist.
Jetzt wird auf meinem Produktionsserver immer eine Fehlermeldung angezeigt, da ich alle lib-Dateien mit Autoload in die application.rb
Datei lade .
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Im Moment habe ich das config.enable_dependency_loading
auf gesetzt , true
aber ich frage mich, ob es eine bessere Lösung dafür gibt. Es muss einen Grund geben, warum das automatische Laden in der Produktion standardmäßig deaktiviert ist.
lib
dir, eine Datei ist in Runtime leicht verfügbar, aber eine andere muss manuell benötigt werden: DValidators
) in Ordnern direkt in der App / im Verzeichnis, da der Code dort automatisch geladen wird.app/services/paylinx/paylinx_service.rb
:module Paylinx class PaylinxService end end
. Ich habe dieseautoload_paths
Sachen ausprobiert . funktioniert bei mir nichtAntworten:
Meine Liste der Änderungen nach dem Wechsel zu Rails 5:
lib
dir in,app
da der gesamte Code in der App automatisch in dev geladen und eifrig in prod geladen wird und vor allem in der Entwicklung automatisch geladen wird, damit Sie den Server nicht jedes Mal neu starten müssen, wenn Sie Änderungen vornehmen.require
Anweisungen, die auf Ihre eigenen Klassen verweisen,lib
da sie ohnehinrequire
automatisch geladen werden, wenn ihre Datei- / Verzeichnisnamen korrekt sind. Wenn Sie Anweisungen hinterlassen , kann das automatische Laden unterbrochen werden. Mehr Infos hierconfig.eager_load = true
in allen Umgebungen ein, um Probleme beim Laden von Code in dev eifrig zu sehen.Rails.application.eager_load!
bevor Sie mit Threads spielen, um Fehler bei "zirkulären Abhängigkeiten" zu vermeiden.Wenn Sie Ruby / Rails-Erweiterungen haben, lassen Sie diesen Code im alten
lib
Verzeichnis und laden Sie sie manuell vom Initialisierer. Dadurch wird sichergestellt, dass Erweiterungen vor Ihrer weiteren Logik geladen werden, die davon abhängen kann:quelle
lib
Ordner jetzt? Ich meine,lib
dir inapp
dir zu verschieben scheint eine Art Workaround zu sein./app/lib/
platzierte eine Datei / Klasse und es wird NICHT automatisch geladen. getestet in Schienen 5.1, neues ProjektRails.application.eager_load!
lib
haben eine andere wahrgenommene Nähe zum Projekt als Dinge imapp
Verzeichnis. Einige der anderen Antworten sind besser als diese.Ich habe nur Akostadinov im Github-Kommentar verwendet,
config.eager_load_paths
anstatt ihn zuconfig.autoload_paths
erwähnen: https://github.com/rails/rails/issues/13142#issuecomment-275492070Es arbeitet in der Entwicklungs- und Produktionsumgebung.
Dank Johan für Vorschlag zu ersetzen
#{Rails.root}/lib
mitRails.root.join('lib')
!quelle
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
stattdessen, weilconfig.eager_load_paths
es sich um ein eingefrorenes Array handeltapplication.rb
, funktioniert dies mit beiden Methoden.Das automatische Laden ist in der Produktionsumgebung aus Sicherheitsgründen deaktiviert. Vielen Dank an @ Зелёный für den Link.
Ich habe dieses Problem gelöst, indem ich die lib-Dateien in einem
lib
Ordner in meinemapp
Verzeichnis gespeichert habe, wie auf Github empfohlen . Jeder Ordner imapp
Ordner wird automatisch von Rails geladen.quelle
config.eager_load_paths << "#{Rails.root}/lib"
, das ist besser IMO, um die empfohlene Rails-App-Struktur zu befolgen.app/lib
von Schienen empfohlen Mitglieder github.com/rails/rails/issues/13142#issuecomment-275549669lib
ist. Ich würde warten, bis sich Tenderlove oder DHH einschalten. In der Zwischenzeit würde ich (persönlich) empfehlen, bei der Antwort von @Lev Lukomsky zu bleiben./lib
Verzeichnis überhaupt nicht brauchen sollten . Bibliotheken von Drittanbietern sind meistens Edelsteine, und wenn nicht, sollte ein Edelstein erstellt werden. Für andere Dateien erstelle ich bestimmte Ordner im/app
Verzeichnis. Zum Beispielvalidators
.Hier ist eine lange Diskussion zu diesem Thema. https://github.com/rails/rails/issues/13142
quelle
Dies ermöglicht das automatische Laden von Bibliotheken und funktioniert auch in der Produktionsumgebung.
PS Ich habe meine Antwort geändert. Jetzt werden beide Pfade zum automatischen Laden unabhängig von der Umgebung erweitert, um auch in benutzerdefinierten Umgebungen (wie z. B. Stage) arbeiten zu können.
quelle
Ändern Sie einfach config.autoload_paths in config.eager_load_paths in der Datei config / application.rb. Da in Rails 5 das automatische Laden für die Produktionsumgebung standardmäßig deaktiviert ist. Für weitere Details folgen Sie bitte dem Link .
Es funktioniert sowohl für die Umweltentwicklung als auch für die Produktion.
quelle
In gewissem Sinne gibt es in Rails 5 einen einheitlichen Ansatz zur Zentralisierung der Eifrig- und Autoload-Konfiguration. Gleichzeitig wird der erforderliche Autoload-Pfad hinzugefügt, wenn das Eifrig-Laden konfiguriert wird, da es sonst nicht ordnungsgemäß funktioniert:
quelle
Für jeden, der wie ich damit zu kämpfen hat, reicht es nicht aus, nur ein Verzeichnis darunter zu platzieren
app/
. Ja, Sie erhalten ein automatisches Laden, aber kein erneutes Laden, für das die Namespace-Konventionen erfüllt sein müssen .Durch die Verwendung des Initialisierers zum Laden der alten Root-Ebene
lib
wird außerdem verhindert, dass die Funktion während der Entwicklung neu geladen wird.quelle
Das Verschieben des lib-Ordners in die App hat zur Lösung eines Problems beigetragen. Meine Twitter-API wurde in der Produktion nicht ausgeführt. Ich hatte "konstantes TwitterApi nicht initialisiert" und meine Twitter-API befand sich in meinem lib-Ordner. Ich hatte
config.autoload_paths += Dir["#{Rails.root}/app/lib"]
in meiner application.rb, aber es hat nicht funktioniert, bevor der Ordner verschoben wurde.Das hat den Trick gemacht
quelle
um Levs Antwort zusammenzufassen:
mv lib app
war genug, um meinen gesamtenlib
Code automatisch laden / neu laden zu lassen.(Schienen 6.0.0beta3, sollte aber auch auf Schienen 5.x gut funktionieren)
quelle