Neri は、Ruby スクリプトを Ruby 未インストール環境の Windows 向けに配布するためのパッケージングシステムです。
同種の gem としては OCRA がありますが、以下のような違いがあります。
- OCRA に比べての長所
- 展開しない分、起動が速い。
- 実行ファイルを複数作りたいとき、OCRA ではサイズの大きな実行ファイルを複数生成することになってしまうが、Neri ではシステムファイルを共有できるため全体のサイズが大きくならずに済む。
- OCRA に比べての短所
- 基本的に、Ruby Installer 2 With Devkit で Ruby をインストールした環境でしか利用できない。(なお、使用前に
ridk enable
を実行してパスを通す必要があります。)
- 基本的に、Ruby Installer 2 With Devkit で Ruby をインストールした環境でしか利用できない。(なお、使用前に
$ gem install neri
bundler を用いた利用もできますが、その場合同梱するファイルが増えてしまうのでおすすめしません。
まず、ridk enable
を実行して開発環境にパスを通す必要があります。
$ neri [options] script.rb (other_files...) -- script_arguments
上の例では、一度 "script.rb" を依存ファイルチェックのために実行し、 その際に必要としたファイルを依存ファイルとして出力先にコピーした上で、 実行ファイルを作成します。
出力先フォルダを丸ごとコピーすれば、Ruby 未インストール環境でもスクリプトを実行できます。
- --help or -h
- ヘルプを表示します。
- --version or -v
- バージョンを表示します。
- --quiet
- 実行中に途中経過等を表示しなくなります。
- --external-encoding
- 出力の文字コードを設定します。後述する --pause-text 等の設定で文字化けが生じる場合、sjis 等を設定してください。
Neri は実行時に必要と思われるファイルを自動的に依存ファイルとして出力先にコピーしますが、 その判定がうまくいかず実行に必要なファイルが足りない場合もあります。 そうした場合はこれらのオプションで依存ファイルを手動で追加する必要があります。
(もしくは、直接出力先に手動で必要なファイルをコピーするのも1つの方法です。)
- --dll <dll1>,<dll2>,...
- bin フォルダ内の指定された dll ファイルを依存ファイルに追加します。
- --lib <lib1>,<lib2>,...
- ロードパス($LOAD_PATH)内の指定されたファイルを依存ファイルに追加します。
- --gem <gem1>,<gem2>,...
- 指定された gem のファイルを依存ファイルに追加します。 デフォルトでは、該当 gem の lib フォルダ内のファイル一式を依存ファイルに追加します。(たとえば `--gem gemname:dir1|dir2` とすれば、lib フォルダ以外のファイルを追加できます。) 現状、gem 間の依存等はチェックしないので、必要な gem すべてを手動で追加する必要があります。
Neri はデフォルトでは、enc フォルダ内の文字コードライブラリをすべて依存ファイルに加えますが、 その分全体のファイルサイズが大きくなってしまいます。 これらのオプションでコピーする文字コードライブラリを指定することで、最小限のデータ量にすることができます。
- --no-enc
- 文字コード関係ファイルを、実際に使用したもの以外は依存ファイルに加えないようにします。
- --encoding <enc1>,<enc2>,...
- 追加する文字コード関係ファイルを手動で指定します。
↓ 使用例:"windows_31j.so", "japanese_sjis.so" のみを依存ファイルに追加します。
$ neri --encoding windows_31j.so,japanese_sjis.so script.rb
- --enable-gems
- --disable-gems (デフォルト)
- rubygems を使用するかどうかを設定します。--disable-gems の場合も、依存チェック時に使用した gem のファイルは vendor_ruby フォルダ内にコピーされるため、rubygems 無しでも実行できるようになります。
- --enable-did-you-mean
- --disable-did-you-mean (デフォルト)
- did_you_mean を使用するかどうかを設定します。
- --no-chdir
- Neri で作成した実行ファイルは、デフォルトでは実行時にカレントフォルダを実行ファイルと同じフォルダに設定します。このオプションを使うとカレントフォルダを変更しなくなります。(このオプションを使うと、日本語フォルダ下などではうまく動かなくなる可能性があるので注意してください。)
- --pause-last
- --no-pause-last
- 実行の最後に、pause を入れるか否かを設定します。省略した場合、コンソールアプリ(後述)の場合 on に、ウィンドウアプリの場合 off になります。
- --pause-text <text>
- pause を入れる場合の表示内容を設定します。
- --output-dir <dirname>
- 出力先フォルダ名を指定します。省略すると、カレントフォルダ(./)になります。
- --system-dir <dirname>
- ruby 等がコピーされる、システムフォルダ名を指定します。デフォルトは "system" です。
- --datafile <filename>
- データファイル名を指定します。省略した場合、実行スクリプトファイルのファイル名の拡張子を ".dat" に変更したものになります。 なお、このオプションを省略&実行スクリプトファイル以外にデータファイルに入れるファイルが無い場合、データファイルは作成されず、実行スクリプトファイルがそのままシステムフォルダ内にコピーされます。
- --encryption-key <key>
- データファイルの暗号化キーを設定します。省略した場合、暗号化は行われません。 暗号化は簡単なものなので、解読されては困るような重要なデータには用いないでください。
- --virtual-directory <dirname>
- データファイルからファイルを読み出す際、Neri はまず実行時のカレントフォルダをもとにファイルを検索し、見つからない場合はこの virtual-directory をもとにファイルを検索します。省略した場合は自動的に適切な仮想パスを生成します。
- --no-exe or --bat
- exe ファイルは作成せず、bat ファイルを作成します。
- --icon <iconfile>
- アイコンを設定します。
- --windows or --invisible
- --console or --visible
- ウィンドウアプリにするかコンソールアプリにするかを設定します。 ウィンドウアプリの場合、いわゆる「DOS窓」が開きません。 省略した場合、実行スクリプトファイルの拡張子が ".rbw" の場合、あるいは [DXRuby](http://dxruby.osdn.jp/) や [Gosu](https://www.libgosu.org/ruby.html), [LibUI](https://github.com/kojix2/libui) を使用する場合にはウィンドウアプリになります。 そうでない場合はコンソールアプリになります。
- --fileversion <version>
- --productversion <version>
- ファイルバージョン・製品バージョンを設定します。 <version> は、1,2,3,4 のように4つの数字をカンマ区切りで設定します。
- --productname <string>
- --internalname <string>
- --description <string>
- --company <string>
- --trademarks <string>
- --copyright <string>
- 製品名・内部名・ファイルの説明・会社名・商標・著作権を設定します。
- --privatebuild <string>
- --specialbuild <string>
- --comments <string>
- コメント等を設定します。
HOME フォルダ、あるいはカレントフォルダにneri.config
というファイルを用意しておくと、以上のオプションをいちいち入力しなくても、neri.config
に書かれたオプション設定を使用します。
neri.config
には上記のオプションを、下のように改行で区切って入力してください。
--icon myicon.ico
--encryption-key foo
--output-dir ../bar
コマンドラインオプション←カレントフォルダ←ホームフォルダの順で優先されます。
たとえば以下のようにすることで、script.rb だけでなく、data フォルダ内のデータ一式をデータファイルに収めることができます。
$ neri script.rb data/*
データファイル内のスクリプトファイルは、require
や load
で読み込むことができます。
また、元のスクリプトファイルで require 'neri'
しておくことで、以下のような命令でデータファイル内のデータにアクセスできます。
Neri.file_exist?(filename) # -> bool
ファイルが「データファイル内」または「実際に」存在すれば true を、無ければ false を返します。
Neri.file_read(filename, encoding = Encoding::BINARY) # -> String
「データファイル内」または「実際に」存在するファイルをまるごと読み込みます(読み込むサイズは指定できません)。データファイル内にも実ファイルとしても存在する場合、データファイル内のものが優先されます。
Neri.files # -> Array
データファイル内にあるファイルの一覧を配列で返します。
DXRuby を使用する場合、DXRuby の Image.load, Image.load_tiles, Sound.new を上書きし、データファイル内に画像・音声ファイルがあればそちらから読み込むようになります。 これにより、スクリプトファイルを一切書き換えることなく、Neri を利用したファイルの簡易隠蔽機能が利用できます。
Neri は依存ファイルチェックのためにスクリプトを一度実行するので、その終了を待つか途中で強制終了させる必要があります。しかし、実行ファイル作成時には NeriBuild
というモジュールが存在するので、以下のように NeriBuild
が存在する場合は早期に終了するようにすることができます。
require "foobar"
# 必要なライブラリの読み込みがすべて終了
exit if defined? NeriBuild
Neri で作られた実行ファイルを実行すると、環境変数 NERI_EXECUTABLE
に実行ファイルのパスが保存されます。
puts ENV["NERI_EXECUTABLE"]
Bug reports and pull requests are welcome on GitHub at https://github.com/nodai2hITC/neri
The gem is available as open source under the terms of the MIT License.