RubotyでHubotスクリプトが使えるruboty-hubotを公開した
TL; DR;
ruboty-hubot
を使うとscripts
ディレクトリ以下に置いた単純なHubotスクリプトをRubotyで実行出来る。
経緯
以前、Hubotスクリプトのhubot-sushiyukiをruboty-yasyとして移植した記事のまとめで、HubotスクリプトをRubotyで動かせるのではないかと書いた。
今回はHubotスクリプトを人間が読んで解釈してRubotyにわかるように翻訳した。 Hubotのプラグインのインターフェイスはある程度決まっている。 RubotyとHubotスクリプトの間をつなぐようなハンドラーがあれば、HubotスクリプトをそのままRubotyのスクリプトとして動かすことも出来るのではないかと考えている。
実際に可能なのか実験してみた。
くふうしたところ
RubotyとHubotスクリプトをつなぐ
lib/ruboty/hubot/robot.rbでHubotのAPIを実装し、Rubotyから結果を取れるようにした。
Herokuでも動く
heroku/heroku-buildpack-rubyではexecjs
が入っている場合、JSの実行環境としてnode
をインストールしてくれる。
ちなみにnpmは入らない。Rubyのビルドパックに加えてnpmも欲しい場合はddollar/heroku-buildpack-multiを使うとよい。
もんだい
npm
パッケージとして公開されているhubotスクリプト、external-scripts.json
に書かれているようなものが実行できない。hubot-scripts.json
が読み込めない。.coffee
で書かれたhubotスクリプトが実行できない。- インターフェイスの互換性が
robot.respond
しか実装できていない。(robot.hear
やrobot.http
がない` require
などCommonJSっぽい機能はexecjs
で使えない。なので外部パッケージに依存するスクリプトは実質動かせない。- Hubotのrobotと同じように互換層を
ruboty-hubot
側で用意してあげると実行できるようになりそう。
- Hubotのrobotと同じように互換層を
まとめ
思ったよりも簡単にHubotが動いてしまった。ただし実用するには問題が多々ある。 JSとRubyの境界線に小さい穴をあけて通り抜けるのは簡単だけど自由に行き来できる大きな穴をあけるのは難しい。