J'ai mis à niveau l'une de mes applications de Rails 4.2.6 vers Rails 5.0.0. Le guide de mise à niveau indique que la fonction de chargement automatique est maintenant désactivée en production par défaut.
Maintenant, j'obtiens toujours une erreur sur mon serveur de production car je charge tous les fichiers lib avec autoload dans le application.rb
fichier.
module MyApp
class Application < Rails::Application
config.autoload_paths += %W( lib/ )
end
end
Pour l'instant, j'ai réglé le config.enable_dependency_loading
sur true
mais je me demande s'il existe une meilleure solution à cela. Il doit y avoir une raison pour laquelle le chargement automatique est désactivé par défaut en production.
lib
dir, un fichier est facilement disponible dans Runtime, mais un autre doit être requis manuellement: DValidators
) dans des dossiers directement dans le répertoire app / car le code y est automatiquement chargé.app/services/paylinx/paylinx_service.rb
définition de classe:module Paylinx class PaylinxService end end
. J'ai essayé cesautoload_paths
trucs. ne fonctionne pas pour moi.Réponses:
Ma liste de changements après le passage à Rails 5:
lib
dir dansapp
car tout le code à l'intérieur de l'application est chargé automatiquement dans le développement et chargé avec impatience dans prod et, plus important encore, est chargé automatiquement en développement afin que vous n'ayez pas à redémarrer le serveur à chaque fois que vous apportez des modifications.require
instructions pointant vers vos propres classes à l'intérieurlib
car elles sont toutes chargées automatiquement si leur nom de fichier / répertoire est correct, et si vous laissez desrequire
instructions, cela peut interrompre le chargement automatique. Plus d'infos iciconfig.eager_load = true
dans tous les environnements pour voir les problèmes de chargement de code avec impatience dans dev.Rails.application.eager_load!
avant de jouer avec les threads pour éviter les erreurs de «dépendance circulaire».Si vous avez des extensions ruby / rails, laissez ce code dans l'ancien
lib
répertoire et chargez-les manuellement depuis l'initialiseur. Cela garantira que les extensions sont chargées avant votre logique supplémentaire qui peut en dépendre:la source
lib
dossier maintenant? Je veux dire, déplacerlib
dir dansapp
dir semble un peu comme une solution de contournement./app/lib/
placé un fichier / classe et ce n'est PAS un chargement automatique. testé dans les rails 5.1, nouveau projetRails.application.eager_load!
lib
ont une proximité perçue différente avec le projet que les choses dans l'app
annuaire. Plusieurs des autres réponses sont meilleures que celle-ci.Je viens d'utiliser
config.eager_load_paths
au lieu deconfig.autoload_paths
mentionner comme mention akostadinov sur le commentaire github: https://github.com/rails/rails/issues/13142#issuecomment-275492070Il fonctionne sur l'environnement de développement et de production.
Merci Johan pour la suggestion de remplacer
#{Rails.root}/lib
parRails.root.join('lib')
!la source
config.eager_load_paths << Rails.root.join('lib')
.config.eager_load_paths += [Rails.root.join('lib')]
place parce queconfig.eager_load_paths
c'est un tableau geléapplication.rb
cela fonctionnera en utilisant les deux méthodes.Le chargement automatique est désactivé dans l'environnement de production en raison de la sécurité des threads. Merci à @ Зелёный pour le lien.
J'ai résolu ce problème en stockant les fichiers lib dans un
lib
dossier de monapp
répertoire comme recommandé sur Github . Chaque dossier duapp
dossier est chargé automatiquement par Rails.la source
config.eager_load_paths << "#{Rails.root}/lib"
, c'est mieux IMO pour suivre la structure de l'application de rails recommandée.app/lib
est recommandée par les membres de rails github.com/rails/rails/issues/13142#issuecomment-275549669lib
. J'attendrais que Tenderlove ou DHH interviennent. En attendant, je recommanderais (personnellement) de m'en tenir à la réponse de @Lev Lukomsky./lib
répertoire. Les bibliothèques tierces sont la plupart du temps des gemmes et sinon, une gemme devrait être créée. Pour les autres fichiers, je crée des dossiers spécifiques dans le/app
répertoire. Par exemplevalidators
.Voici une longue discussion sur cette question. https://github.com/rails/rails/issues/13142
la source
Cela permet de charger automatiquement la librairie et fonctionne également dans l'environnement de production.
PS J'ai changé ma réponse, maintenant cela ajoute aux deux chemins de chargement automatique, quel que soit l'environnement, pour permettre également de travailler dans des environnements personnalisés (comme la scène)
la source
Changez simplement config.autoload_paths en config.eager_load_paths dans le fichier config / application.rb. Parce que dans les rails 5, le chargement automatique est désactivé par défaut pour l'environnement de production. Pour plus de détails, veuillez suivre le lien .
Cela fonctionne à la fois pour le développement de l'environnement et la production.
la source
Dans un certain sens, voici une approche unifiée dans Rails 5 pour centraliser la configuration hâte et chargement automatique, en même temps, il ajoute le chemin de chargement automatique requis chaque fois que la charge hâtive est configurée, sinon il ne pourra pas fonctionner correctement:
la source
Pour quiconque a eu du mal avec cela comme moi, il ne suffit pas de placer un répertoire sous
app/
. Oui, vous obtiendrez un chargement automatique mais pas un rechargement nécessaire , ce qui nécessite le respect des conventions d'espacement de noms .De plus, l'utilisation de l'initialiseur pour charger l'ancien niveau racine
lib
empêchera le rechargement de la fonction pendant le développement.la source
Le déplacement du dossier lib vers l'application a permis de résoudre un problème, mon API Twitter ne fonctionnait pas en production. J'avais "TwitterApi constant non initialisé" et mon API Twitter était dans mon dossier lib. J'avais
config.autoload_paths += Dir["#{Rails.root}/app/lib"]
dans mon application.rb mais cela n'a pas fonctionné avant de déplacer le dossier.Cela a fait l'affaire
la source
pour résumer la réponse de Lev:
mv lib app
était suffisant pour que tout monlib
code soit rechargé / rechargé automatiquement.(rails 6.0.0beta3 mais devrait fonctionner correctement sur les rails 5.x aussi)
la source