mrubyでいくつかのCLIツールを作っているのだが、ツールごとにオプションのパーサを作ったりしていて本来作りたい機能をつくるまでの道程が長くなっていた…。 これはいかんとなったので、CLIフレームワークをほそぼそと作っていたのだがやっといい感じになったのでブログにすることにした。
ThorのAPIを真似て作ったので、トールの息子であるmagniという名前にしてみた*1。 このmagni、大分いい感じにできたので便利ポイントを紹介したい。
1. 手軽な導入
mrubyでCLIツールを作る場合、以下を準備しなくてはならなかった。
- mrubyのソースコード
- build_config.rb
- mrbgem.rake
- main関数を含んだ src/tools/*/.c
- ↑から呼び出されるRubyのエントリーポイント
また、これらのファイルにどういう内容を記述するべきかという情報が少なくなかなかハードルが高い。
[!NOTE] https://github.com/hone/mruby-cli というOSSがあり、これを使うとこれらのファイルを用意してくれるのだが、開発が止まっていてmruby-3.xに対応していない。 私がforkしてmruby-3.xに対応した版(https://github.com/buty4649/mruby-cli)もあるのだが、そちらも更新していない…。
そこでmagniは、1と2以外のファイルを内包することで導入ハードルを下げることができる。 そのため必要なファイルは以下だけになった。
- mrubyのソースコード
- build_config.rb
実装を書くまでの道程がかなりショートカットされるのでとても便利になった。 詳しい手順はREADMEを見てほしい。
2. 最低限の依存
magniではmrubyのcoreで管理されているmgemのみで構成している。 正確には、オプションパーサとして利用しているmruby-tiny-optparseがcoreじゃないのだが、これ自体も最低限のcoreなmgemのみで構成されている。
依存を絞っているのはビルド時間の短縮とライフタイムの延長が目的である。 依存が増えるとそれに伴ってビルド時間が延びていく。微々たるものではあるが、magniを使った開発を行っているときにビルドが長くなると開発体験を損なうことになるので、依存を減らしている。 また、mgemは多数公開されてはいるものの、実態としてメンテナンスされているものは少ない。。そのため、メンテナンスが続いているcoreにのみ依存することで長期に渡ってビルド可能になる…はず。
3. Thorライクなインターフェイス
RubyでCLIフレームワークと言ったらThorを思い浮かべる人が多いと思う。 そのため、仮にmagniを使ってmrubyでCLIを作りたいという人がいた場合にThor互換であれば敷居が低くなると思う。 実際、私もThorには慣れているのでmagniを使いやすくそして、Thorに似せることになるのでmagni自体を実装するのも楽であった。
おわりに
mruby向けの軽量CLIフレームワークとしてmagniを作った。 実際、私の作っているrfも独自オプションパーサ/CLIフーレムワークから、magniに載せ替えたのでまたこれも別途ブログに書きたいと思う。
もしmrubyでCLIツールを作りたい!っとおもったひとはぜひmagniを使ってみてほしい。
*1:どういう活躍をしたのかは全然知らない…