好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Exerb 覚え書き

Rubyスクリプトを単独実行可能な Windows実行形式ファイルにするソフトウェア。

存在は前々から知っていたけど、初めて必要になったので使ってみた。

ドキュメントが充実しているので、exe を作るまでで困ったところは無し。gem に入ってると思ったら無くて、肩透かしをくらったような感はあったけど(苦笑)。

で、レシピファイル(*.exy)とやらに、実行時に使う Rubyファイルを、添付ライブラリなどのものも含めて全部書かないといけないというのが、めんどくさい。つか、そのぐらい一部の特殊な奴を除いてやってくれればいいのに。ということで、どっかにありそうだけど作った。

# 追記
# って、普通に mkexy が添付されてるじゃないかorz
# ちゃんとドキュメント読め!<自分

# exyputs.rb

if __FILE__ == $0
  exit if ARGV.size <= 0
  loaded_before = $LOADED_FEATURES.clone
  # 引数1つ目は require
  startup = ARGV.shift
  require startup
  loaded = $LOADED_FEATURES - loaded_before
  # 2つ目以降は 直接追加(動的に変わる部分(主に load 用?))
  loaded.concat ARGV
  loaded.uniq!

  puts <<-EOS
general:
  startup: #{startup}
file:
  #{loaded.join(":\n  ")}:
EOS

end

使ってみる。

# sample.rb

require 'pp'
require 'yaml'
require File.join(File.dirname(__FILE__), 'imas.rb')

if __FILE__ == $0
  pp IMAS_B
  puts IMAS_B.to_yaml
end
# imas.rb

IMAS_B = {
  'Yayoi Takatsuki' => 72,
  'Chihaya kisaragi' => 72,
  'Azusa Miura' => 91,
}
>ruby exyputs.rb sample.rb > sample.exy

>exerb sample.exy

>sample.exe
sample.rb:4:in `require': No such file to load -- yaml (LoadError)
        from sample.rb:4

‥‥ダメじゃん。

yaml.rb が最初からロードされてるらしい。なんでそんな意外なものが‥‥そんなに意外でもないか。

他のライブラリとかの事も考えると、$LOADED_FEATURES の差分なんてとらずに、全部出すべきなのかもしれんね。

# exyputs.rb

if __FILE__ == $0
  exit if ARGV.size <= 0
  #loaded_before = $LOADED_FEATURES.clone
  loaded_before = [] # ロード済みは無いことにする
  # 引数1つ目は require
  startup = ARGV.shift
  require startup
  loaded = $LOADED_FEATURES - loaded_before
  # 2つ目以降は 直接追加(動的に変わる部分(主に load 用?))
  loaded.concat ARGV
  loaded.uniq!

  puts <<-EOS
general:
  startup: #{startup}
file:
  #{loaded.join(":\n  ")}:
EOS

end

exy は長くなるけど、別にいいや。exe もでかくなるけど別にいいや。

今まで、まったく意識したこと無かったけど、こっちで require する前からロードされているものって結構多いのね。

$ ruby -e "puts \$LOADED_FEATURES"
rbconfig.rb
rubygems/rubygems_version.rb
thread.rb
rbconfig/datadir.rb
rubygems/user_interaction.rb
socket.so
timeout.rb
net/protocol.rb
uri/common.rb
uri/generic.rb
uri/ftp.rb
uri/http.rb
uri/https.rb
uri/ldap.rb
uri/mailto.rb
uri.rb
net/http.rb
stringio.so
yaml/error.rb
syck.so
yaml/ypath.rb
yaml/basenode.rb
yaml/syck.rb
yaml/tag.rb
yaml/stream.rb
yaml/constants.rb
rational.rb
date/format.rb
date.rb
yaml/rubytypes.rb
yaml/types.rb
yaml.rb
zlib.so
rubygems/remote_fetcher.rb
digest.so
digest/sha2.so
rubygems/digest/digest_adapter.rb
rubygems/digest/sha2.rb
forwardable.rb
parsedate.rb
time.rb
rubygems/source_index.rb
rubygems/version.rb
rubygems/specification.rb
openssl.so
openssl/bn.rb
openssl/cipher.rb
openssl/digest.rb
openssl/buffering.rb
fcntl.so
openssl/ssl.rb
openssl/x509.rb
openssl.rb
rubygems/gem_openssl.rb
rubygems/security.rb
rubygems/custom_require.rb
rubygems.rb
ubygems.rb

‥‥ gems のせい?