2023/10/21(土) [n年前の日記]
#1 [ruby] Rubyスクリプトをexe化できるneriを試用
Rubyスクリプトをexe化できるツールとしては ocra が一番メジャーかなと思うのだけど、ocra は必要になるファイルを1つのファイルにまとめて、exeを実行する度にテンポラリフォルダに展開するので起動が遅い。
あらかじめファイルを展開した状態にしてexe化できるツールはないのかなとググっていたら、neri というツールがあると知った。試しに使ってみることにした。
_neri | RubyGems.org | コミュニティのgemホスティングサービス
_GitHub - nodai2hITC/neri: One-Click Ruby Application Builder
_neri/README.ja.md at main - nodai2hITC/neri - GitHub
_Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する #Ruby - Qiita
環境は Windows10 x64 22H2 + Ruby 2.6.10 p210 x86 (+ DevKit)。
あらかじめファイルを展開した状態にしてexe化できるツールはないのかなとググっていたら、neri というツールがあると知った。試しに使ってみることにした。
_neri | RubyGems.org | コミュニティのgemホスティングサービス
_GitHub - nodai2hITC/neri: One-Click Ruby Application Builder
_neri/README.ja.md at main - nodai2hITC/neri - GitHub
_Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する #Ruby - Qiita
環境は Windows10 x64 22H2 + Ruby 2.6.10 p210 x86 (+ DevKit)。
◎ インストール :
gem install neri
◎ 使い方 :
動作させるには DevKit が必要になるらしい。
基本的には以下のような感じで呼び出せばいいらしい。
hoge.exe と、動作に必要なファイルをまとめてある systemフォルダが出来上がる。
今回は Ruby/Tk を使ったスクリプトをexe化してみたかったので、以下の指定をしてみた。
exe化を試みたスクリプトは以下。
_03_hello_tk.rb
しかし、出来上がったexeを実行してみると、以下のエラーが出る。
「unknown encoding name - utf-8; (ArgumentError)」とな…。
エンコード関係の .so が足りてないのだろうかと思ったけれど、system\lib\ruby\2.6.0\i386-mingw32\enc\ 以下に、大量にソレっぽい .so が入っていた。これだけじゃダメなのかな…。
色々試してたら、元のスクリプトの最初のあたりに以下の行があるかないかでエラーメッセージが違ってくることに気づいた。この行があると、utf-8 云々のエラーが出る…。これってエディタにファイルの文字コードを知らせるためだけの行じゃないの…?
今度は「tkが無い」と言い出した…。そもそも「fiddle と tk は無視する」と言ってるあたりも気になる…。systemフォルダ内には、tk86.dll とか tcltklib.so 等があるように見えるのだけど…。これだけじゃ足りないのかな…。
neri に、--enable-gems --gem tk --gem fiddle をつけてみたり、msys32以下のディレクトリの指定を無くしたり等してみたけれど、問題は解決せず。ハードルが高いツールだなと…。
基本的には以下のような感じで呼び出せばいいらしい。
ridk enable neri hoge.rb事前に ridk enable を実行しておくことに注意。
hoge.exe と、動作に必要なファイルをまとめてある systemフォルダが出来上がる。
今回は Ruby/Tk を使ったスクリプトをexe化してみたかったので、以下の指定をしてみた。
ridk enable neri 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems
> neri 03_hello_tk.rb D:\Ruby\Ruby26-x86\msys32\usr\bin\msys-2.0.dll D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tcl8.6 D:\Ruby\Ruby26-x86\msys32\mingw32\lib\tk8.6 --gem tk --enable-gems === Running script '03_hello_tk.rb' to check dependencies. === Script '03_hello_tk.rb' end. === 576 files, 14769110 bytes dependencies. === Copying dependencies. === Creating datafile './system/03_hello_tk.dat'. === virtual_directory: D:/home/prg/ruby/_work_sample/tk/hello_tk === Creating exe_file '.\03_hello_tk.exe'. === Neri Finished.
exe化を試みたスクリプトは以下。
_03_hello_tk.rb
しかし、出来上がったexeを実行してみると、以下のエラーが出る。
> 03_hello_tk.exe Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9 D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `force_encoding': unknown encoding name - utf-8; (ArgumentError) from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:162:in `load_code' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:84:in `load' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load' from -e:2:in `<main>'
「unknown encoding name - utf-8; (ArgumentError)」とな…。
エンコード関係の .so が足りてないのだろうかと思ったけれど、system\lib\ruby\2.6.0\i386-mingw32\enc\ 以下に、大量にソレっぽい .so が入っていた。これだけじゃダメなのかな…。
色々試してたら、元のスクリプトの最初のあたりに以下の行があるかないかでエラーメッセージが違ってくることに気づいた。この行があると、utf-8 云々のエラーが出る…。これってエディタにファイルの文字コードを知らせるためだけの行じゃないの…?
# -*- mode: ruby; coding: utf-8; encoding: utf-8 -*-
> 03_hello_tk.exe Ignoring fiddle-1.0.9 because its extensions are not built. Try: gem pristine fiddle --version 1.0.9 Ignoring tk-0.4.0 because its extensions are not built. Try: gem pristine tk --version 0.4.0 D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require': cannot load such file -- tk (LoadError) from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:85:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:68:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:16:in `require' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/03_hello_tk.rb:11:in `<main>' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `eval' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:88:in `load' from D:/home/prg/ruby/_work_sample/tk/hello_tk/exe_by_neri/03_hello_tk/system/lib/ruby/gems/2.6.0/gems/neri-1.1.0/lib/neri/runtime.rb:20:in `load' from -e:2:in `<main>'
今度は「tkが無い」と言い出した…。そもそも「fiddle と tk は無視する」と言ってるあたりも気になる…。systemフォルダ内には、tk86.dll とか tcltklib.so 等があるように見えるのだけど…。これだけじゃ足りないのかな…。
neri に、--enable-gems --gem tk --gem fiddle をつけてみたり、msys32以下のディレクトリの指定を無くしたり等してみたけれど、問題は解決せず。ハードルが高いツールだなと…。
◎ 雑感 :
サクッとexe化できるなら Python + tkinter + pyinstaller と比較できるかなと思ったけれど、全然サクッといかない感じなので…。
exe化の容易さ、exe化したモノの起動速度、外部ライブラリが将来的にも維持されそうか等々、そういった点を考えると、Python ではなく Ruby を使うメリットは皆無と言うか、むしろ Ruby を選択するのはデメリットだらけなのではないかと思えてきた…。まあ、あくまで、ローカルで動くGUIアプリを作ろうとするなら、という前提の話だけど。
Ruby から Qt を使えるようにする _qtbindings というライブラリの作者様も、「こんなの使うより Python 使いましょう」と README.md にわざわざ書いていたけど。妥当な発言だよなと…。
exe化の容易さ、exe化したモノの起動速度、外部ライブラリが将来的にも維持されそうか等々、そういった点を考えると、Python ではなく Ruby を使うメリットは皆無と言うか、むしろ Ruby を選択するのはデメリットだらけなのではないかと思えてきた…。まあ、あくまで、ローカルで動くGUIアプリを作ろうとするなら、という前提の話だけど。
Ruby から Qt を使えるようにする _qtbindings というライブラリの作者様も、「こんなの使うより Python 使いましょう」と README.md にわざわざ書いていたけど。妥当な発言だよなと…。
[ ツッコむ ]
以上です。