58 votes

Ruby on Rails 3 - Recharge le répertoire lib pour chaque requête

Je crée un nouveau moteur pour une application rails 3. Comme vous pouvez le deviner, ce moteur se trouve dans le répertoire lib de mon application.

Cependant, j'ai quelques problèmes pour le développer. En effet, je dois redémarrer mon serveur chaque fois que je change quelque chose dans le moteur.

Y a-t-il un moyen d'éviter cela?

Puis-je forcer rails à recharger complètement le répertoire lib ou un fichier spécifique et ses exigences pour chaque requête?

Merci de votre aide :)

49voto

pbhogan Points 1380

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 suis arrivé à ceci:

Nouveau fichier: config/initializers/reload_lib.rb

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"]) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

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

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

Qui vient par défaut permet de s'assurer de tout mon répertoire lib est chargé.

Yays!

33voto

shime Points 3023

TL;DR

  • mettre ceci dans le fichier config/application.rb

    config.eager_load_paths += ["#{Rails.root}/lib"]

  • retirez require les relevés de votre lib fichiers

Allez!


Laissez-moi vous expliquer en détail.

Je ne sais pas pourquoi cette réponse est acceptée, car il ne permet pas de recharger 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 lib fichiers à l'intérieur d' app/models dans le développement puis en les déplaçant à l' /lib lorsque vous avez terminé. Nous pouvons faire mieux, non?


Ma solution est testée contre:

  • Rails 3.0.20
  • Rails 3.1.12
  • Rails 3.2.13
  • Rails 4.0.0.rc1

Mettre ceci dans votre config/application.rb:

# in config/application.rb
config.eager_load_paths += ["#{Rails.root}/lib}"]

Ça y est!™

Assurez-vous de le mettre ici, car il sera de ne pas fonctionner si vous le mettez en config/environments/development.rb, par exemple.

Assurez-vous que votre supprimer tous les require consolidés pour votre /lib code require des déclarations aussi 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:

# in config/application.rb
config.eager_load_paths += ["#{Rails.root}/lib"] if Rails.env.development?

vous devriez regarder sur le vieux - require des déclarations, étant donné qu'ils sont encore nécessaires 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!

require "beer_creator" unless Rails.env.development?

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.

21voto

Paul Saladna Points 131

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 je suis allé vers le bas de la piste, la seule solution qui a fonctionné a été l'une sur hemju.commais je n'ai vraiment pas envie d'avoir à pirater le ApplicationController pour les Dev de vitesse.

13voto

dishod Points 191

Vous devez ajouter

 config.autoload_paths += %W(#{config.root}/lib)
 

à votre classe d'application dans config / application.rb

https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib

3voto

jeremiemv Points 78

Voici ma version inspirée de la réponse de @pbhogan qui recharge tous les fichiers ruby de votre répertoire rails / lib lorsque l’un de ces fichiers est modifié.

Il met également les avertissements en sourdine afin d'éviter les messages concernant les constantes déjà initialisées.

Fonctionne à partir de Rails 3.2.8

 if Rails.env.development?

  lib_ruby_files = Dir.glob(File.join("lib/**", "*.rb"))
  lib_reloader ||= ActiveSupport::FileUpdateChecker.new(lib_ruby_files) do
    lib_ruby_files.each do |lib_file|
      silence_warnings { require_dependency(lib_file) }
    end
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end

end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X