我需要一个非常基本的例子来展示一个小型基础程序,它可以读取两个插件并将它们注册到程序中。这两个插件以相同的方式与基础程序进行钩子绑定,且不会产生冲突。
我对任何编程语言中的元编程都非常陌生,不确定从何处开始。
我需要一个非常基本的例子来展示一个小型基础程序,它可以读取两个插件并将它们注册到程序中。这两个插件以相同的方式与基础程序进行钩子绑定,且不会产生冲突。
我对任何编程语言中的元编程都非常陌生,不确定从何处开始。
# config.rb
class Configuration
end
class MySystem
def self.configure
@config ||= Configuration.new
yield(@config) if block_given?
@config
end
Dir.glob("plugins/**/*.rb").each{|f| require f}
end
MySystem.configure do |config|
config.some_method
config.some_value = "whatever"
config.test = "that thing"
end
puts "some value is: #{MySystem.configure.some_value}"
puts "test #{MySystem.configure.test}"
为了获取配置类上的some_method和some_value,我让插件通过模块扩展配置对象:
# plugins/myconfig.rb
module MyConfiguration
attr_accessor :some_value
def some_method
puts "do stuff, here"
end
end
class Configuration
include MyConfiguration
end
并且
# plugins/another.rb
module AnotherConfiguration
attr_accessor :test
end
class Configuration
include AnotherConfiguration
end
只需要一小段代码,就可以加载插件:在特定文件夹中查找.rb文件并使用'require'命令加载它们。这个代码可以放在任何地方,只要在包含它的文件被加载时立即运行即可... 我可能会先将其放在MySystem类定义中之类的地方。后面如果有必要,再将其移动到其他地方。
Dir.glob("plugins/**/*.rb").each{|f| require f}
运行config.rb,你会得到类似以下内容的输出:
这里做一些事情 某个值是:任何东西 测试那个东西
有很多方法可以实现其中的各个部分,但这应该能让你走上正确的方向。
看起来这个项目可能会有所帮助:https://github.com/eadz/plugman
然而,我还没有找到任何可以处理嵌入式(gem)依赖关系的东西。包括Ruby文件很简单,但是一旦你的插件开始需要其他库,那么这个简单模型就会崩溃(要么所有依赖项都必须与应用程序一起安装,要么您需要某种机制将插件依赖的gem引入进程中)。