Gemify redmine plugins
I want to install redmine plugins by adding gem name to Gemfile.local like redmine_github_hook plugin.
Current installing/updating method have below cautions for me.
- Difficult to specify plugin version
- Server maintainer should exec `$ git clone [--depth=1] -b <release version> https://github.com/foo/bar/`, but plugin README often describes installing master
- Difficult to detect plugins vulnerability with using bundler-audit
- We have to check each plugins by hand now
I'm happy if Redmine::Plugin.load requires gem's init.rb.
- Easy to install plugin: only writing gem name to Gemfile.local
- Easy to specify plugin version: only specifying gem version to Gemfile.local
- Easy to update plugin: only executing `$ bundle update <plugin gem name>`
- Easy to detect (only gemified) plugins vulnerability with using bundler-audit
- Redmine should detect wheather redmine plugin or not from all bundle installed gem
For example, support_gem_plugin.patch can load gemified plugin.
Gemfile.local example is below(I fixed little existing sidebar_hide plugin).
gem 'sidebar_hide', github: 'sho-h/sidebar_hide', branch: 'redmine_support_gem_plugin_test'
This was gemified and specified directory in init.rb.
#2 Updated by Sho HASHIMOTO 10 months ago
"require initializer" is called twice. Is it correct?
One is in this patch and another is in original code.
Oh... Maybe it's cause problem.
I left original code. Original code is for loading current structure plugins.
I think, there are below patterns.
- Same plugin and same version: Maybe, problem doesn't break to the surface.
- Same plugin and different version: Cause problems. Both require will success. Overwritten by plugin dir's one halfway.
- Different plugins and same ID: Cause problems. Both require will success. Each function will not be conflicted. But redmine will misunderstand only plugin dir's one was loaded.
- Different plugins and different IDs: No problem.
1., 2., 3. have same problem. @registered_plugins[id] was overwritten.
To fix this, for example, Redmine::Plugin.register(id) raises(or fails) if plugin was already installed.
def self.register(id, &block) + raise ... if installed?(id) # or return + p = new(id) p.instance_eval(&block)
I think, it is difficult to find 2. by administrator if only return.