Hatena::Grouprubyist

Rubyで遊ぶよ

2011-04-06

RBat を使って、Windows で Ruby インタープリタごと Ruby スクリプトを配布する

10:15

Ruby 1.9対応してもらいました。 Ruby製アプリケーションの配布方法とか « Alias under the Azure


Windows の人向けに何か簡単なソフトを作ろうとして、Ruby のあのライブラリとか使うと一発なんだけどなー、と思ったりすることがある。みんな WindowsRuby インストールしてればいいのに!と。

Exerb を使えばスクリプトを全部まとめて .exe にすることができるのだけど、Exerb 自体がちょっと面倒。exy ファイルを作って、とか。しかも .exe にしたスクリプトが何故かエラーで動かなかったりするし。

じゃあ ruby.exe ごと配布したらいいじゃん!

そういうスクリプトを作った。

アイデアは Exerb と同じ。.exe を作るか作らないかの違いみたいなもん。


使い方

自分で書いた Ruby スクリプトがあるフォルダを A とし、

A/
A/your-script.rb
A/some-library.rb

こんな感じのフォルダ構造になってるとする。

手元でこのスクリプトを使うときは、A に入って

> C:\Ruby186\bin\ruby your-script.rb

というふうに実行するものとする。この Ruby186 は RubyInstaller for Windows っていうのでインストールしたときのパス。iconv や zlib 等の dll が最初から入ってるのでおすすめ。

または Cygwin からだと

$ /cygdrive/c/Ruby186/bin/ruby your-script.rb

となる。ただし、Cygwin 版の Ruby は再配布には適さないので、Cygwin から使うときも mswin32 版か mingw32 版を使ったほうがいい。


次に、A の中に rbat.rb をダウンロードしてきて、

$ /cygdrive/c/Ruby186/bin/ruby -r./rbat your-script.rb

のように実行すると、スクリプトが普通に走り、A の中に ruby-dist というフォルダができ、さらに、your-script.bat というバッチファイルも作られる。

A/
A/your-script.rb
A/your-script.bat
A/your-library.rb
A/ruby-dist/
A/ruby-dist/ruby.exe
A/ruby-dist/lib/

こんな感じ。(ちょっと省略した。後述)

ruby-dist/lib の中にはこのスクリプトが読み込んだライブラリが全部含まれていて、your-script.bat を実行すると、ruby-dist/ruby のほうを使って your-script.rb を起動することになっている。

すなわち、このフォルダ全体を zip にして配布すれば、使う人は解凍して your-script.bat をダブルクリックするだけとなる。

zip にするときは rbat.rb は不要。


制限

ruby-dist フォルダにコピーされるファイルは、

  1. Ruby インタープリタ自身
  2. require されているライブラリ (.rb と .so)
  3. Ruby インタープリタと同じフォルダ内にある .dll 全部

となっている。dll を不必要なものも含めて全部コピーしてしまうのは、$LOADED_FEATURES 変数ではどの dll がロードされているかまでは分からないため。

なので、ruby-dist フォルダの中を見て、「これは明らかに使われてないな」と思うものは削除してもいい。(または削除しつつ試しに走らせてみてもいい)

それから、Ruby と同じフォルダ内にはない(しかも普通の人はインストールしてない) dll に依存してた場合は、当然配布したときに動かない。

そこで、dll.rb というスクリプトも作った。これは、昨日書いたようにどこでも動くかどうか分からないが、開いている dll を全部リストしてくれる。

$ /cygdrive/c/Ruby186/bin/ruby -r./dll your-script.rb

というふうに。

この結果と ruby-dist フォルダの中身を見比べて、不要な dll を削除したり、必要な dll を足したりすればいい。

トラックバック - http://rubyist.g.hatena.ne.jp/edvakf/20110406