Итак, одну вещь, которую вы можете сделать, это выбрать каноническое имя для ваших плагинов, а затем использовать это соглашение для динамической загрузки.
Похоже, что весь ваш код находится под модулем Scaffolder
, поэтому вы можете создавать плагины, следуя следующим правилам:
Scaffolder
драгоценные камни должны быть названы scaffold-tools-plugin-
pluginname
- Все плагины предоставляют один класс с именем
Scaffolder::Plugin::
Имя плагина
- Этот класс должен соответствовать некоторому интерфейсу, который вы документируете, и, возможно, предоставлять базовый класс для
Учитывая это, вы можете принять аргумент командной строки загружаемых плагинов (при условии OptionParser
):
plugin_names = []
opts.on('--plugins PLUGINS','List of plugins') do |plug|
plugin_names << plug
end
Тогда:
plugin_classes = []
plugin_names.each do |plugin_name|
require "scaffold-tools-plugin-#{plugin_name}"
plugin_classes << Kernel.const_get("Scaffold::Plugin::#{plugin_name}")
end
Теперь plugin_classes
- это Array
объектов класса для настроенных плагинов. Предположим, что все они соответствуют некоторому общему конструктору и некоторым распространенным методам:
plugin_classes.each do |plugin_class|
plugin = plugin_class.new(args)
plugin.do_its_thing(other,args)
end
Очевидно, что при такой большой динамической загрузке классов вы должны быть осторожны и доверять коду, который вы запускаете. Я предполагаю, что для такого маленького домена это не будет проблемой, но просто будьте осторожны с require
случайным кодом.