【问题标题】:Ruby Plugin ArchitectureRuby 插件架构
【发布时间】:2010-06-24 18:07:20
【问题描述】:

我想要一个非常基本的小型基础程序示例,它读取两个插件并注册它们。这两个插件以不冲突的方式以相同的方式挂接到基础程序。

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

【问题讨论】:

  • 对不起,我有点迂腐,但插件不是与 Rails 框架相关联的,而不是与 ruby​​ 本身相关联的吗?
  • rails 框架有插件,但我说的是在 ruby​​ 应用程序的上下文中创建插件系统。假设您有一个读取文本文件的类。我想创建一个插件系统,让您编写一个挂钩到阅读器类的插件类,以便您可以制作一个 UpCase 插件或修改输出的 1337 插件。这是一个基本示例,但这应该会给您一个想法。
  • ruby 不仅仅是 rails,即使 rails 是最知名的框架。说插件与轨道相关就像说汽油与跑车相关。还有很多其他使用汽油的东西,包括非机动车辆。
  • @Derick:我实际上是在问,因为我不使用 Rails(只是普通的旧 Ruby 对象),也没有遇到过插件。

标签: ruby plugins metaprogramming


【解决方案1】:

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

就我而言,我专门研究配置并引入配置插件,但即使我的术语是特定于配置的,原理也是一样的。

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

# 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 文件并“要求”它们。只要在加载包含它的文件时立即运行,此代码就可以存在于任何地方......我可能会将它放在 MySystem 的类定义中或类似的东西开始。可能会在有意义的情况下将其移至其他地方。

Dir.glob("plugins/**/*.rb").each{|f| require f}

运行 config.rb,你会得到如下所示的输出:

做事,在这里
一些价值是:不管
测试那个东西

有很多选项可以实现它的各个部分,但这应该会让你走上正轨。

【讨论】:

    【解决方案2】:

    看起来这个项目可能会有所帮助:https://github.com/eadz/plugman

    然而,我还没有找到任何可以处理嵌入式(gem)依赖项的东西。包含 Ruby 文件很简单,但是一旦您的插件开始需要其他库,那么这个简单的模型就会崩溃(所有的 deps 都必须与您的应用程序一起安装,或者您需要一些其他机制来将插件依赖项 gem 放入流程中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多