La solution dans l’article précédent ne me plaisait pas, alors j’ai fais ma solution … bon j’avoue j’ai pas cherché s’il existe déjà une solution prête à l’emploi.
Personnellement, je préfère que config. reload_plugins soit à false. Mais je ne veux pas mettre dans mes plugins un bout de code qui dépend plus de l’application et du contexte (development/production) que du plugin lui même.
Je pourrais mettre reload_plugin à true, oui mais je n’ai pas forcément envie de recharger toute la masse de plugin à chaque requête.
Dans un premier temps, on va ajouter une directive de configuration à savoir reloadable_plugins, et on va la traiter au moment du chargement des plugins. Voici le code :
Rails::Configuration.class_eval do attr_accessor :reloadable_plugins def initialize_with_reloadable_plugins initialize_without_reloadable_plugins self.reloadable_plugins = default_reloadable_plugins end def default_reloadable_plugins [] end alias_method_chain :initialize, :reloadable_plugins end Rails::Plugin::Loader.class_eval do def add_plugin_load_paths_with_reloadable_plugins load_path = add_plugin_load_paths_without_reloadable_plugins plugins.each do |plugin| if configuration.reloadable_plugins.include?(plugin.name.to_sym) ActiveSupport::Dependencies.load_once_paths -= plugin.load_paths end end load_path end alias_method_chain :add_plugin_load_paths, :reloadable_plugins end
qu’on va mettre dans lib/configuration_reloadable_plugins.rb par exemple.
Ensuite ajouter dans le fichier config/environnement.rb, juste après le boot.rb (l’ordre est important)
... require File.join(File.dirname(__FILE__), 'boot') require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot') require 'lib/configuration_reloadable_plugins' ... Et toujours dans <strong>config/environnement.rb</strong> on indique les plugins à recharger : ... Rails::Initializer.run do |config| config.reloadable_plugins = [ :foo, :bar ] config.reload_plugins = false ... end ...
Et pour vérifier que c’est bon :
$ script/console >> ActiveSupport::Dependencies.load_once_paths.select{ |p| p =~ /foo/ } => []