Defect #36801
Rails Autoload Paths contain plugin libs twice
Status: | New | Start date: | ||
---|---|---|---|---|
Priority: | Normal | Due date: | ||
Assignee: | - | % Done: | 0% | |
Category: | Plugin API | |||
Target version: | - | |||
Resolution: | Affected version: | 4.2.4 |
Description
Due to the way plugins are loaded by Redmine the variable
ActiveSupport::Dependencies.autoload_paths
contains the path to the 'lib' directory of each plugin twice, which should not happen.
When Redmine loads the plugins from config/initializers/30-redmine.rb
it calls
Redmine::Plugin.load
Redmine::Plugin.load
(defined in lib/redmine/plugin.rb
) adds the 'lib' directory of each plugin to
ActiveSupport::Dependencies.autoload_paths
and to
$LOAD_PATH #alias $:
When each plugin calls
Redmine::Plugin.register
from init.rb (which they ought to do), then in Redmine::Plugin.register
all Rails paths in the plugin directory are created by calling
engine_cfg.paths
implicitly by calling
engine_cfg.paths.add 'lib', eager_load: true
Then in Redmine::Plugin.register
the following call causes the second addition of the autoload_paths
ActiveSupport::Dependencies.autoload_paths +=
engine_cfg.eager_load_paths + engine_cfg.autoload_once_paths + engine_cfg.autoload_paths
In some environments this may cause trouble.
History
#1
Updated by Stephan Wenzel 3 months ago
A fix could be adding
ActiveSupport::Dependencies.autoload_paths.uniq
as the last line in @Redmine::Plugin.load
#2
Updated by Marius BALTEANU 3 months ago
Can you test on current trunk where we switched the autoloading from classic to zeitwerk (#29914)?