Rfm+RubyでFileMakerを操作するスクリプトをEXE化でござるの巻

ActiveScriptRuby+Exerbで、FileMakerアクセス用ライブラリ「Rfm」を使ったスクリプトExerbでEXE化してみよー。

環境

lardawge-rfmはSSL接続機能があり、またXML解析に「nokogiri」を使っているのでDLL同梱が必要。

ExerbRubyGemsは相性が悪い?

via. http://twitter.com/bopper/status/7638207994

require 'rubygems' unless $Exerb
require 'rfm'

これでEXE化して実行したときに「C:\lib\ruby」が勝手に作られるのを防止できる。

ExerbとRfmは相性が悪い?

「require 'rfm'」 だけではEXE化したときにRfmが正常に読み込めなかったので、

require 'rubygems' unless $Exerb
require 'rfm'
require 'rfm/utility'
require 'rfm/factory'
require 'rfm/result'
require 'rfm/commands/database'
require 'rfm/commands/layout'
require 'rfm/commands/server'

という感じに各ファイルを明示的にロードした。Rfm固有の問題? gemでインストールしたTMailも同時に使ってみたがそっちは正常動作。

.exyファイルにpath:セクションを追加してfile:セクションにDLLを記述

via. http://d.hatena.ne.jp/snaka72/20091231/1262253107

1. ActiveScriptRuby付属のrb2exeをスタートメニューから起動。
2. GUI操作に「mkexy」コマンドでレシピファイル(.exy)を作成。
3. .exyファイルをテキストエディタで開き、path:セクションにDLLが存在するパスを追加する。

path:
  - C:\ruby\v187\lib\ruby\gems\1.8\gems\nokogiri-1.4.1-x86-mswin32\ext\nokogiri
  - C:\ruby\v187\bin

4. .exyファイルの末尾にRfm(やその他ライブラリ)が使うDLLファイルを追加。

  ssleay32.dll:
  libeay32.dll:
  iconv.dll:
  libexslt.dll:
  libxml2.dll:
  libxslt.dll:
  zlib1.dll:

EXE作成コマンドをCUIから実行

コマンドプロンプトを起動し、Rubyスクリプトと.exyファイルのあるディレクトリに移動して以下を実行。

C:\>exerb -Ku [.exyファイル名]

DLLを同梱したEXEが作成されるので、別マシンに持っていって実行できるか確認。

動いた!けど動かなかった!

Rubyが入ってないXPマシン実機では動作した。うれしい!


が、Rubyが入っていないXPマシン仮想機では

net/protocol.rb:70: [BUG] Segmentation fault

と出て動作しなかった。いまいち不明だがおいおい調べる!