mieki256's diary



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)。

インストール :

gem install neri

使い方 :

動作させるには DevKit が必要になるらしい。

基本的には以下のような感じで呼び出せばいいらしい。
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 にわざわざ書いていたけど。妥当な発言だよなと…。

以上です。

過去ログ表示

Prev - 2023/10 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project