RailsEngines 2.3 (suite)
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 config/environnement.rb 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/ }
=> []
Laissez un commentaire