Ruby on Rails 3 - Reload répertoire lib pour chaque demande
Je suis en création d'un nouveau moteur pour rails 3. Comme vous pouvez le deviner, ce moteur est dans le répertoire lib de mon application.
Cependant, j'ai quelques problèmes de développement. En effet, j'ai besoin de redémarrer mon serveur à chaque fois que je change quelque chose dans le moteur.
Est-il un moyen pour éviter cela ?
Puis-je la force de rails pour recharger complètement le répertoire lib ou un fichier spécifique et de ses exigences pour chaque requête ?
Merci pour votre aide 🙂
Vous devez vous connecter pour publier un commentaire.
TL;DR
mettre cela en config/application.rb
config.eager_load_paths += ["#{Rails.root}/lib"]
supprimer
require
consolidés pour votre lib fichiersAller!
Laissez-moi vous expliquer en détail.
Je ne sais pas pourquoi cette réponse est acceptée, car il ne permet pas de rechargement dossier lib sur chaque demande. J'ai d'abord pensé que cela fonctionne pour les Rails 2, mais la question indique clairement que c'était pour Rails 3 et la date de sortie de la 3.0.0 est antérieure à la date de la réponse.
D'autres réponses paraître compliqué ou n'offrent pas de solution réelle.
J'ai décidé d'étudier un peu les choses, parce qu'il a été me tracasse et j'ai même découvert que les gens ont une solution et il implique la sauvegarde fichiers lib à l'intérieur de
app/models
dans le développement puis en les déplaçant vers/lib
lorsque vous avez terminé. Nous pouvons faire mieux, non?Ma solution est testée contre:
Mettre ceci dans votre
config/application.rb
:Que c'est!™
Assurez-vous de le mettre ici car il sera pas de travail si vous le mettez dans
config/environments/development.rb
, par exemple.Assurez-vous que votre supprimer tous les
require
consolidés pour votre/lib
code depuisrequire
déclarations seront également provoquer cette solution ne fonctionne pas.Ce code est implicite dans votre code, donc si vous avez de l'environnement de contrôle (qui sont inutiles) et au lieu de le code ci-dessus, vous décidez d'écrire quelque chose comme ceci:
vous devriez regarder sur le vieux
require
états, puisqu'ils sont toujours requis sur tous les environnements de développement, dans ce scénario.Donc, si vous décidez malgré tout de faire de l'environnement vérifie, assurez-vous que vous n'inverse vérifie pour exiger des déclarations. Sinon, vous allez vous faire piquer!
Vous pourriez penser que l'écriture de tout le paragraphe à propos de quelque chose qui est inutile est également inutile, mais je pense que la population en garde contre quelque chose qui est nécessaire quand vous faites quelque chose de superflu, est également nécessaire.
Si vous souhaitez en savoir plus sur ce sujet, consultez ce petit tutoriel.
require
déclarations ourequire_relative
instruction pas chaud rechargeable.Je ne pouvais pas obtenir tout ce qui précède à travailler pour moi, alors j'ai creusé dans les Rails de code un peu et est venu avec cette:
Nouveau fichier: config/initializers/reload_lib.rb
Oui, je sais c'est dégueulasse mais c'est un hack. Il pourrait y avoir une meilleure façon de déclencher un rechargement complet, mais cela fonctionne pour moi. Mon cas d'utilisation spécifiques est une application Rack monté sur Rails route donc j'ai besoin de recharger, j'ai travaillé dans le développement.
Essentiellement, ce qu'il fait c'est qu'il vérifie si tous les fichiers dans le répertoire /lib ont changé (modifié timestamp) depuis le dernier chargement, puis déclenche un rechargement si elles changent.
Je pourrais aussi mentionner que j'ai dans ma config/application.rb
Qui vient par défaut permet de s'assurer de tout mon répertoire lib est chargé.
Yays!
/lib/appname/api.rb
commence avecAppname::API < Grape::API
) et cela fonctionne (alors que laautoload_paths
fix ne marche pas).true
et tout devrait fonctionner correctement à nouveau.ActiveSupport::FileUpdateChecker.new([], Dir["lib/**/*"])
lib/**/*
.Rails.application.reload_routes!
de rechargement de l'application?ActionDispatch::Callbacks.to_prepare
est dépréciée en faveur deActiveSupport::Reloader.to_prepare
Puisque nous parlons des Rails, le plus simple est de 'besoin' de votre lib/* .rb fichiers à l'aide de 'require_dependency'. Tant que le contrôleur/helper/etc (.rb fichiers dans le dossier app/) utilise require_dependency au lieu de juste besoin de recharger les œuvres, sans le besoin de faire quelque chose de funky.
Avant que je suis allé vers le bas de la piste, la seule solution qui a fonctionné a été l'une sur hemju.com, mais je n'ai vraiment pas envie d'avoir à pirater le ApplicationController pour Dev vitesse.
Vous devez ajouter
à votre classe d'Application dans config/application.rb
https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib
$:.unshift(config.root); config.autoload_paths += %w(app/models/misc)
je pense à mes fichiers lib comme la logique métier, et j'ai mis de la logique métier dans mes modèles, de sorte qu'ils sont mes Modèles, mais pas de db-a persisté, et il est juste qu'ils sont dans app/models/misc et pas dans lib.Dans RAILS 3, voici le secret de la sauce à l'auto-recharger les fichiers lib. Le code ci-dessous est un peu exagéré, pour l'exemple, mais c'est ce que j'ai fait pour le faire fonctionner. Vous pouvez modifier le message en YoYo#gogo et de le voir sur l'écran chaque chargement de la page. Enlever l'initialiseur, et il reste le même.
/config/initializers/lib_reload.rb (nouveau fichier)
/lib/yo_yo.rb
/app/controllers/home_controller
Voici ma version inspirée de @pbhogan's réponse qui recharge tous les rubis dans vos fichiers de rails /lib lors de l'un de ces fichiers est modifié.
Il a également fait taire les mises en garde pour éviter les messages concernant déjà initialisé constantes.
Fonctionne comme des Rails 3.2.8
Mise à jour de réponse
Somme de toutes mes découvertes sur mon blog, tu ferais mieux de regarder là:
Vieille réponse
Je regardai autour de moi pour trouver une solution pour ça aussi, et (à des fins d'exhaustivité et aussi à pointer les autres dans cette direction), voici ce que j'ai trouvé.
De Rails3.1, les moteurs peuvent être facilement généré par la commande
rails plugin new my_plugin --full
. Cela génère le squelette de un moteur.--full
signifie que le moteur sera "fusionné" droit dans le y compris l'application, de sorte que, par exemple, les contrôleurs devraient être directement accessibles que si elles ont été définies dans le y compris app. Cela permet, par exemple, vous demandez à une personne de fichier dansmy_engine/app/helpers/my_helper.rb
qui sera fusionné dans votre, y compris l'applicationapp/helpers/my_helper.rb helper
.Il y a une autre option
--mountable
qui crée un espace de noms pour le moteur de sorte que ses contrôleurs etc. ne sera jamais entrer en collision avec l', y compris l'application de celles. Il en résulte par exemple une assistance dansmy_engine/app/helpers/my_engine/my_helper.rb
qui ne pas entrer en collision avec un helperapp/helpers/my_helper.rb
y compris dans votre application.Maintenant la partie la plus intéressante:
Au sein de l'généré moteur de
test
dossier, il y a undummy
dossier qui détient une complète application Rails! Quel est-il?Lorsque vous développez un moteur, ses fonctionnalités sont conçues pour fonctionner entièrement sur leurs propres, et il doit aussi être testé complètement sur son propre. Donc, c'est la "mauvaise" façon de développer un moteur "à l'intérieur" d'une autre application Rails (si cela intuitivement souvent sentirez lors de l'extraction des fonctionnalités existantes à partir d'une application Rails dans un moteur), et donc, théoriquement, il n'est pas nécessaire de recharger un moteur code à chaque requête pour l', y compris l'application.
Le "droit" chemin semble être le suivant: développer et tester votre moteur, comme si c'était une application Rails complète à l'aide de la
dummy
app! Y vous pouvez faire tout ce que vous pouvez faire dans le cas "normal" application Rails, par exemple, créer des contrôleurs, modèles, vues, etc. qui utilisent les fonctionnalités que le moteur doit fournir. Vous pouvez aussi normalement à partir d'un serveur à l'aide derails s
dans votretest/dummy
répertoire et accéder à l'application d'exemple surlocalhost:3000
, et lors de l'exécution de vos tests, de ladummy
application est automatiquement utilisée pour les tests d'intégration. Très gentil! 🙂Vous devez faire attention où mettre vos trucs:
my_engine/app
, alors que toutes les fonctionnalités qui sont nécessaires pour tester le moteur de la fonctionnalité va danstest/dummy/app
.Puis, ensuite, vous pouvez facilement charger votre moteur de votre application principale du
Gemfile
comme ceci:gem 'my_engine', :path => 'path/to/my_engine'
ou le publier sur GitHub comme un bijou.(Une chose intéressante (et pour revenir à ce sujet par sujet), c'est que lorsque je démarre le mannequin du serveur, puis toutes les modifications dans le moteur semble être reflétés à l'intérieur d'elle!!! Donc, en quelque sorte, il semble être possible d'inclure un moteur dans une application Rails, sans cache, il...? Je ne sais pas comment cela se passe.)
Donc, pour résumer: un moteur fournit une fonctionnalité qui peut être complètement sur son propre, donc il devrait également être développé et testé sur son propre. Puis, quand il a atteint un état stable, il peut être compris par n'importe quelle autre application qui a besoin de ses fonctionnalités.
Voici quelques ressources que je trouve très utiles:
J'espère que vous trouverez cette réponse utile. Je suis encore très nouveau pour les moteurs en général, donc si il y a le tort d'informations, s'il vous plaît dites-moi, et je vais le corriger.
Ajouter à
application_controller.rb
ou votre contrôleur de base:A fonctionné pour moi.
noter que dans Rails 3 "load_once_paths" devient "autoload_once_paths."
Aussi, il semble qu'il devrait être vide, sauf si vous explicitement de mettre quelque chose en elle.
Aussi, assurez-vous que vous commentez la ligne suivante dans l'application.rb (en plus du @dishod de la solution), et assurez-vous que votre nom de module est le même que le nom de votre fichier (dans le cas contraire, rails de ne pas être capable de le trouver)
Travaillé pour les Rails 3.2.13 pour le rechargement lib à l'intérieur de la gemme d'une application:
require_dependency 'the_class'
ET
config.autoload_paths += %W(#{config.racine}/../fantasy/lib)