Rubyアプリの開発者にとって悩ましい問題の一つに、エンドユーザーの環境にどうやってRubyの実行環境を導入するかという問題があるかもしれません。Rubyアプリの実行には、RubyのインタプリタやRubyGemsが必要なのに、エンドユーザーの環境ではこれらのソフトウェアがインストールされていない事が多いからです。
この問題を解決するために開発されたツールが「Traveling Ruby」です。RubyインタプリタやRubyGems「全部込み」のRubyアプリの作成を助けてくれるツールです。
サンプルアプリの作成
どのようなものか理解するために、Tutorial 1: hello worldを実行してみるのが分かりやすいです。
現在のところTraveling RubyはMac/Linuxにしか対応していません。以下Macで実行してみました。
前準備
hello_appディレクトリを作成し、その中にhello.rbを作成します。
$ mkdir hello_app $ cd hello_app $ echo '#!/usr/bin/env ruby' > hello.rb $ echo 'puts "hello world"' >> hello.rb $ ruby hello.rb hello world
packageディレクトリの作成
package作成の準備を行います。まずhello.rbを以下のフォルダにコピー。
$ mkdir -p hello-1.0.0-osx/lib/app/ $ cp hello.rb hello-1.0.0-osx/lib/app/
packagingフォルダを作成し、専用のRuby実行環境をダウンロードします。その後hello-1.0.0-osx以下に展開します。
$ mkdir packaging $ cd packaging $ curl -L -O --fail http://d6r77u77i8pq3.cloudfront.net/releases/traveling-ruby-20141209-2.1.5-osx.tar.gz $ cd .. $ mkdir hello-1.0.0-osx/lib/ruby && tar -xzf packaging/traveling-ruby-20141209-2.1.5-osx.tar.gz -C hello-1.0.0-osx/lib/ruby
これは要するに、hello-1.0.0-osx以下に自作のスクリプトとRuby実行環境を配置しただけです。現段階でhello_app以下のディレクトリ階層は次のような構造になっています。
テスト
現段階でスクリプトが実行できるかテストします。
$ cd hello-1.0.0-osx $ ./lib/ruby/bin/ruby lib/app/hello.rb hello world $ cd ..
wrapper scriptの作成
hello.rbを簡単に呼び出せるようラッパースクリプトを作成します。
packaging/wrapper.shを以下の内容で作成。
#!/bin/bash set -e # Figure out where this script is located. SELFDIR="`dirname \"$0\"`" SELFDIR="`cd \"$SELFDIR\" && pwd`" # Run the actual app using the bundled Ruby interpreter. exec "$SELFDIR/lib/ruby/bin/ruby" "$SELFDIR/lib/app/hello.rb"
実行パーミッションをつけ、hello-1.0.0-osx/helloとしてコピーします。
$ chmod +x packaging/wrapper.sh cp packaging/wrapper.sh hello-1.0.0-osx/hello
パッケージの完成
ここまできたらほぼ完成。あとはtarで固めるだけです。
$ tar -czf hello-1.0.0-osx.tar.gz hello-1.0.0-osx $ rm -rf hello-1.0.0-osx
hello-1.0.0-linux-x86.tar.gzが完成したパッケージです。エンドユーザーはこれを解凍し、以下のように実行できます。
$ /path-to/hello-1.0.0-linux-x86/hello hello world
さらにRakeで以上のプロセスを自動化する方法も掲載されています。気になる方は確認してみてください。
まとめ
Rubyの実行環境と自作スクリプトをtarで固めて配布すればどんな環境でも実行可能なRubyアプリが配布できる…という考えてみれば当たり前の発想ですが、手順化されたことで使いやすくなっていて、そこに利用価値があるのかもしれません。
Rubyアプリの配布に頭を悩ましている開発者の方はチェックしてみてください。