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

  • 9
    いいね
  • 0
    コメント

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

課題

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. そもそも構成管理ツールを使うなどするべきという話もあります。 

この投稿は mruby Advent Calendar 201622日目の記事です。