概要

mruby はRuby言語の軽量版です。
主に組み込み環境をメインで開発されていますが、通常のOS(Linux, Mac, Windows)でも動作します。

mruby-cli を使ってクロスプラットフォーム(Linux, Mac, Windows)で動作する mruby のバイナリを生成します。

実行環境

  • Debian stretch (2016/02)
  • mruby 1.1.1
  • python 2.7.11
  • docker-compose 1.5.2-1

事前準備

mruby 本体と必要なパッケージをインストールします。
mruby-cli はクロスコンパイルを docker-compose で実行します。

$ sudo apt-get install mruby docker-compose

インストール

mruby-cli のバイナリファイルをダウンロードします。
環境によりダウンロードするバイナリが異なるので、自分の環境にあったファイルをダウンロードしてください: https://github.com/hone/mruby-cli/releases
Debian 環境 では mruby-cli-0.0.4-i686-pc-linux-gnu.tgz をダウンロードします。

$ wget https://github.com/hone/mruby-cli/releases/download/v0.0.4/mruby-cli-0.0.4-i686-pc-linux-gnu.tgz
$ tar zxvf mruby-cli-0.0.4-i686-pc-linux-gnu.tgz
$ ./mruby-cli -v
mruby-cli version 0.0.4

テストアプリの作成

雛形ファイル

mruby-cli –setup を使ってアプリケーションのスケルトンファイルを作成します。

$ ./mruby-cli --setup myapp
$ cd myapp

アプリの作成

// 以下のファイルを編集してアプリケーションを作成する
$ vi mruby-cli/myapp/mrblib/myapp.rb

コンパイル

// コンパイル(docker 上でクロスコンパイルする)
$ docker-compose run compile

生成するプラットフォームなどの指定は build_config にする。

コンパイル時に ImportError: cannot import name ReadTimeout のエラーが出た時の対応

原因1 pip のバージョンが古い

Debian パッケージの pip は 1.5系なので、パッケージ版の pip を削除して github にある pip (8.0系)をインストールします。

$ sudo apt-get remove python-pip
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ pip --version
pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)

原因2 requests のバージョンが古い

requests をアップデートします。
https://hub.docker.com/r/buluba89/yatcobot/builds/bwdjlk5arsb4nq5uy4gehfr/

$ sudo pip install --upgrade requests

実行ファイル

それぞれ以下にバイナリが生成されます。

  • linux
    • mruby/build/x86_64-pc-linux-gnu/bin/myapp
  • max
    • mruby/build/x86_64-apple-darwin14/bin/myapp

環境ごとのバイナリを置けば実行可能です(mruby の実行環境は不要)。

$ cp mruby/build/x86_64-pc-linux-gnu/bin/myapp user@dokoka.no.linux.server:~/
$ ssh user@dokoka.no.linux.server:~/myapp
Hello World

※ Linux バイナリは gcc-2.14 か 2.15 が必要 (Debian6.0 は2.11)