mruby
mrubyDay 22

ruby製のコマンドラインツールをmrubyに置き換える

More than 1 year has passed since last update.

私が管理しているサーバー上で動く、管理用のツールだったりバッチ処理だったりがいくつかあります。

課題

Rubyで書きたい

Ruby on Rails で開発しているチームで運用しているサーバーなので、おのずとそういったツールも Ruby で作られる事が多いです。1
処理にもよりますが、シェルスクリプトではなく慣れている Ruby で書きたいのです。

Rubyのインストールが必要

Rubyで書きたいとなるとサーバーに Ruby のインストールが必要になります。
Ruby on Railsのアプリが稼働しているサーバーなら、当然 Ruby もインストールされているのですが、そうでないサーバーもあります。OS のパッケージマネージャーで入る Ruby は古いことも多いので rbenv など使ってインストールすることになります。2
シェルスクリプトのツールを使う場合と比べるとインストール直後のサーバーで動く場合も多く、rubyスクリプトでツール運用はやはり手間が増えることになります。3

mruby-cli

mruby-cliとは、mrubyでワンバイナリなコマンドラインラインツールを作るために色々やってくれるツールです。
複数プラットフォーム向けにビルドが可能で、クロスコンパイル環境についてもDockerにて用意されています。Docker for MacをインストールしたMacとmruby-cliがあればMac上だけで、LinuxやWindowsのバイナリをビルド可能になります。
mruby-cli自体がmruby-cliで出来ているので、自分の環境用のバイナリを落としてくればすぐに動きます。
ここからダウンロードしましょう。https://github.com/hone/mruby-cli/releases

開発手順

  • mruby-cliコマンドにてプロジェクトの雛形作成
  • 利用するmgemや、ビルド対象プラットフォーム設定
  • コーディング
  • ローカルでビルド
  • 完成したら対象プラットフォーム用にビルド
  • 出来上がったバイナリを、対象サーバーに置く

実用してみた

上記の開発手順に従って、今回はファイルをS3へ転送するバッチ処理を移植しました。元のツールは ruby2.3.1 で書かれていたものです。
mgemも中々充実していて、ライブラリの機能を呼ぶだけで実装が可能でした。
ただ、ruby と mruby は完全な互換はありませんし、利用したライブラリも、rubyのgemと同じ訳ではないので移植にあたって書き換えは発生しました。

スクリプト自体は、業務で使っているものなので公開出来ませんが、利用した mgem は以下のものです。

  • iij/mruby-io
  • iij/mruby-dir
  • iij/mruby-aws-s3
  • iij/mruby-env
  • mattn/mruby-onig-regexp
  • gromnitsky/mruby-fileutils-simple

それぞれの mgem を見たいただければ分かるのですが、mrubyはファイルシステムが無いような環境も想定されているので、標準ではIOが無かったりします。
それらの機能について、rubyと互換が出るように mgem としてライブラリが作られています。結構な数のライブラリが作られているので、かなり便利にコードを書いていけます。

まとめ

組み込み用という紹介のされ方が多い mruby ですが、mruby-cliのお陰でワンバイナリコマンドラインツールの作成にも使え、組み込み以外にも用途があることがわかりました。
私のように、普通のアプリケーションを書く人が増えて、ライブラリも増えていくといいなと思いますので、組み込み関連は触らない人でも mruby 試してみてはどうでしょうか。



  1. ここでいうサーバーは Linux です。うちでは Cent OS が多いのですが今回の記事ではあまり関係ありません。 

  2. rbenvのお陰でインストールも楽ではありますが。 

  3. そもそも構成管理ツールを使うなどするべきという話もあります。