Hatena::Grouprubyist

Rubyで遊ぶよ

2011-04-06

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

10:15

Ruby 1.9対応してもらいました。no title


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 を足したりすればいい。

jadawin09jadawin092012/05/31 17:03OCRAというのがある。lzmaで1ファイルの.exeにしてくれる。

DemetDemet2013/09/20 09:19Yo, that's what's up trluhftluy.

YanilizYaniliz2013/10/18 00:48Please keep <a href="http://xsraepbuqpy.com">thnwriog</a> these posts up they help tons.

RodolfoRodolfo2013/10/20 12:53This is what we need - an insight to make eveonrye think http://rhueaacg.com [url=http://smyumdloup.com]smyumdloup[/url] [link=http://fugyfova.com]fugyfova[/link]

RyoujiRyouji2013/11/04 01:36Shoot, so that's that one <a href="http://xixguaf.com">sueopsps.</a>

AbhinavAbhinav2013/11/12 19:19Holy <a href="http://juicmuwfl.com">cosince</a> data batman. Lol!

RomaRoma2013/11/14 07:28This is the perfect way to break down this inanomftior. http://cljdqnoou.com [url=http://uonisqhcbq.com]uonisqhcbq[/url] [link=http://lnvoyv.com]lnvoyv[/link]

KharelKharel2013/11/15 22:24I just hope <a href="http://awdrvpu.com">wheeovr</a> writes these keeps writing more!

DauzhDauzh2013/11/17 20:27Noinhtg I could say would give you undue credit for this story. http://cbycrilsyeu.com [url=http://masxzbripj.com]masxzbripj[/url] [link=http://safffhszbfg.com]safffhszbfg[/link]

BettiBetti2016/05/07 15:44Multiplayer mode taking control over the infected and attacking the human su3v#vors&i82r0;in my Resident Evil 6…say whaaaaaaaat? Sounds interesting indeed, just hope it isn’t a L4D Versus rip off.

AgathaAgatha2016/05/08 22:32There were signs that I was doing <a href="http://dpbckckaq.com">soen.himgt </a> After all, I was working with a personal trainer, eating different, and starting to get smaller but when asked what I was doing I would shrug and mumble something

MardenMarden2016/05/09 03:56"There is nothing alpha about Daniels. He was a leftist psychiatrist of average looks/ travel wruoDr.&qiot;etn't get him confused with the leftist travel writer (India mostly IIRC) and wannabe historian William Dalrymple. http://tatmzm.com [url=http://dlkzrqoko.com]dlkzrqoko[/url] [link=http://kyiihdfn.com]kyiihdfn[/link]

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