Ruby插件体系结构

Ruby插件体系结构,ruby,plugins,metaprogramming,Ruby,Plugins,Metaprogramming,我想要一个非常基本的小程序示例,它读入两个插件并注册它们。这两个插件以相同的方式以不冲突的方式钩住基本程序 我对任何编程语言中的元编程都很陌生,我不知道从哪里开始 这个问题我已经研究了一段时间了。我已经尝试了很多不同的方法去做这件事,并征求了很多人的意见。我仍然不确定我所拥有的是否是“正确的方法”,但它工作得很好,而且很容易做到 在我的例子中,我特别关注配置并引入配置插件,但原理是一样的,即使我的术语是特定于CNConfiguration的 在一个非常基本的级别上,我有一个配置类,其中没有任何内

我想要一个非常基本的小程序示例,它读入两个插件并注册它们。这两个插件以相同的方式以不冲突的方式钩住基本程序


我对任何编程语言中的元编程都很陌生,我不知道从哪里开始

这个问题我已经研究了一段时间了。我已经尝试了很多不同的方法去做这件事,并征求了很多人的意见。我仍然不确定我所拥有的是否是“正确的方法”,但它工作得很好,而且很容易做到

在我的例子中,我特别关注配置并引入配置插件,但原理是一样的,即使我的术语是特定于CNConfiguration的

在一个非常基本的级别上,我有一个配置类,其中没有任何内容-它是空的。我还有一个Configure方法,它返回configuration类并允许您对其调用方法:

# 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_方法和some_值,我让插件通过模块扩展配置对象:

# plugins/myconfig.rb
module MyConfiguration
  attr_accessor :some_value

  def some_method
    puts "do stuff, here"
  end
end

class Configuration
  include MyConfiguration
end

要加载插件,您只需要一个代码来查找特定文件夹中的.rb文件并“需要”它们。只要在加载包含该代码的文件时立即运行,该代码就可以在任何地方运行。。。我可能会把它放在MySystem的类定义中或类似的东西中。如果有意义的话,也许可以把它移到别的地方

Dir.glob("plugins/**/*.rb").each{|f| require f}
运行config.rb,您将得到如下输出:

do stuff, here some value is: whatever test that thing 在这里做事 有些价值观是:不管怎样 测试一下那个东西
有很多选项可用于实现此项目的各个部分,但这会让您走上正轨。

看起来此项目可能会有所帮助:


然而,我还没有发现任何能够处理嵌入式(gem)依赖关系的东西。包含Ruby文件很简单,但一旦你的插件开始需要其他库,那么这个简单的模型就崩溃了(要么所有的DEP都必须与你的应用程序一起安装,要么你需要其他机制来将插件依赖项gem引入到这个过程中)。

很抱歉太迂腐了,但是插件不是与Rails框架相关,不是与ruby本身相关吗?Rails框架有插件,但我要说的是在ruby应用程序的上下文中创建插件系统。假设您有一个读取文本文件的类。我想创建一个插件系统,让您编写一个插件类,该类与reader类挂钩,这样您就可以制作一个修改输出的UpCase插件或1337插件。这是一个基本的例子,但这应该给你一个想法。ruby远不止rails,即使rails是最有名的框架。说插件与rails相关就像说汽油与跑车相关。还有很多其他东西都用汽油,包括非机动车的东西。@Derick:我问这个问题是因为我不使用Rails(只是普通的Ruby对象),也没有遇到过插件。 do stuff, here some value is: whatever test that thing