ocraで生成した.exeのエラーに対処した話

こんにちは。(ほ)です。

最近、RubyのScriptを配布する必要があったのですが、対象者がRuby開発者ではない人がほとんどであったため、Scriptから実行ファイルを生成しました。

そのときに発生したエラーについての対処方法を書きます。

実行ファイルを作成したスクリプト

Google SpreadSheet API のCredentialを作成する目的で、下記のスクリプトを使用しました。

Google SpreadSheet API の Ruby Quickstart

本当は、マルチプラットフォーム対応が容易なGo言語やJavaで作れれば良かったのですが、
下記のように言語で扱う形式がバラバラ、かつRubyと同じYAMLで出力するのは他にはないため、今回の方法となっています。

  • Ruby : YAML
  • Go, .NET, Python等 : JSON
  • Java : ?(オブジェクトファイルっぽい)

実行ファイルを生成するツール

Rubyから実行ファイルの生成には ocra を使用しました。

https://github.com/larsch/ocra

このツールは、Rubyのスクリプトと ruby.exe や各種lib、gemをパッケージングすることで、
RubyがインストールされていないWindows環境でも実行できるようにしています。

下記のようなコマンドでocraを実行すると、libやgemの依存関係を推測するための実行が行われ、その後にexeが出力されます。

発生したエラー

ocraを使用して生成したexeを実行すると、下記のエラーが発生しました。

  1. MultiJson::AdapterError
  2. Faraday::SSLError
  3. Faraday::ConnectionFailed

Error No.1 : MultiJson::AdapterError

実行ファイル中にJSONのライブラリが含まれていない場合に、このエラーが発生します。

原因は、下記のソースでいくつかのJSONライブラリを返すようにしているのですが、
このような場合はocraの依存関係の推測がうまく機能しないようです。

https://github.com/intridea/multi_json/blob/v1.12.1/lib/multi_json.rb#L46

そのため、下記のようにimport文をScriptに追加することで対処できます。

実はこれは、下記のようにrubyのすべてのライブラリをパッケージングする --add-all-core オプションを指定することでも対処は可能です。
しかし、.exeのサイズの増加と展開するファイル数の増加により実行までの時間が長くなるため、最小限にした方が良いと思います。

Error No.2 : Faraday::SSLError

このエラーはSSLの証明書が含まれていない場合に発生します。

RubyのSSL証明書は下記のパスなどにあるのですが、ocraはSSL通信をする場合でも、この証明書をパッケージングしてくれません。

c:\Ruby24\ssl\cert.pem

そのため、下記のようにパッケージングするファイルに証明書を指定することで対処できます。

また、 quickstart.rb に証明書ファイルの環境変数を追加します。

Error No.3 : Faraday::ConnectionFailed

Proxyの環境変数が設定されていないPCで実行した場合に発生しました。

これは、下記のようにScriptに環境変数の設定を追加することで対処ができます。

修正内容

quickstart.rb

最終的に下記のようなDiffになるように修正をしました。

コマンド

下記のコマンドでgemインストール、実行ファイルの生成を行いました。

まとめ

ocraは手軽にRubyのScriptから実行ファイルを生成できますが、思わぬところでエラーが発生するようです。

ですが、今回のように必要なファイルが存在しない場合や環境変数が設定されていない場合がほとんどのようですので、慌てずにエラー内容を追ってみてください。
きっと原因が突き止められるはずです。


SNSでもご購読できます。