読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Gemプラグインの仕組み

RubyGemsにはプラグインの仕組みがあって、以下のようにプラグインを検出してロードするとのこと。
Gem の rdoc より。

RubyGems Plugins

As of RubyGems 1.3.2, RubyGems will load plugins installed in gems or $LOAD_PATH. Plugins must be named ‘rubygems_plugin’ are discovered via Gem::find_files then loaded. Take care when implementing a plugin as your plugin file may be loaded multiple times if multiple versions of your gem are installed.

For an example plugin, see the graph gem which adds a `gem graph` command.

  • gems または $LOAD_PATH から 'rubygems_plugin' ファイルを Gem::find_files で探して、全て load します。
  • 古いバージョンのものに含まれる 'rubygems_plugin' も load されるので注意。

この仕組みだと、

  • プラグインの追加/削除をGem経由で行える。
    • 利用者は、必要なプラグインをGem経由でインストールすれば、自動で認識され利用可能になる。
  • ○プログラムにプラグインを添付するのが容易。
    • Gemで依存関係を設定すれば、プログラムと一緒にプラグインもインストールできる。

というメリットがあるなー。ただ、気になるのは、以下の点。

  • ×古いバージョンのGemに含まれる'rubygems_plugin'がロードされる

ロードしたプラグインのクラスやメソッドが、古いバージョンのもので上書き更新されたりしそう。んー、プラグイン内ではクラス定義しないとかそういうルールになっているんだろうか?

graph ではどうしているのか?

ということで、↑でサンプルとして挙げられているgraphをインストールして確認。
graph-1.1.0/lib/rubygems_plugin.rb :

require 'rubygems/command_manager'

Gem::CommandManager.instance.register_command :graph

クラス定義とかはしてないな。あと、rubygems_plugin.rb 内でGemのメソッドを呼び出して機能を登録?する方式なのか。ふむふむ。

プラグインロード部分のコード

RubyGemsプラグインをロードしている部分のコードも確認。
rubygems.rb (の下の方) :

...省略
plugins = Gem.find_files 'rubygems_plugin'

plugins.each do |plugin|
  begin
    load plugin
  rescue => e
    warn "error loading #{plugin.inspect}: #{e.message} (#{e.class})"
  end
end

他に関連するコードがあるかもだけど、普通にロードしているだけみたいですね。