standaloneify.rb トラブルシューティング
RubyCocoaに添付されてる便利スクリプト、standaloneify.rbで問題が起きたときの対処法。
standaloneify.rbとは
各種ライブラリ(.rb, .bundleなど)を.app内にパッケージして配布しやすくするツール。いつのころからかRubyCocoaに添付されてる。
わりと裏技的な実現方法を取ってるので、将来的にはGemfile使うとか別の手法に移行したい。
さいきんの変更
今日時点の最新版はSVNリポジトリの該当ファイルの"Download this file"あたりからどうぞ。
- rubygems-2.1以降でも動作するようにした。
- 実行時に情報をいっぱい出すようにした。
RubyCocoaやRubyのバージョンを出すようにした。ここで表示するのはstandaloneify.rbを実行したものでなく、アプリケーションが利用している(RubyCocoaがリンクしている)Rubyのバージョンなので、1.8系が出力されるはず。
% ruby standaloneify.rb -f -d SimpleApp.app ./build/Default/SimpleApp.app
INFO: RubyCocoa.framework (version 1.1.0) copied from "/Library/Frameworks/RubyCocoa.framework".
standaloneifying Ruby Version: 1.8.7
standaloneifying RubyCocoa Version: 1.1.0
standaloneifying RubyCocoa path: /path_to/SimpleApp.app/Contents/Frameworks/RubyCocoa.framework
standaloneifying Gem::VERSION: 1.8.26
Found gem sqlite3
Skipping RubyCocoa file "osx/objc/oc_exception.rb"
:
Finish: "SimpleApp.app" generated.失敗したとき。
% ruby standaloneify.rb -f -d SimpleApp.app ./build/Default/SimpleApp.app
INFO: RubyCocoa.framework (version 1.1.0) copied from "/Library/Frameworks/RubyCocoa.framework".
standaloneifying Ruby Version: 1.8.7
standaloneifying RubyCocoa Version: 1.1.0
:
/path_to/SimpleApp.app/Contents/Resources/rb_main.rb:10: uninitialized constant FAIL (NameError)
from standaloneify.rb:153:in `require'
from standaloneify.rb:153
>> command: /path_to/SimpleApp.app/Contents/MacOS/SimpleApp --rubycocoa-ruby-opt standaloneify.rb --standaloneify
>> dyld: loaded: /fullpath_to/SimpleApp.app/Contents/MacOS/SimpleApp
>> dyld: loaded: /fullpath_to/SimpleApp.app/Contents/MacOS/../Frameworks/RubyCocoa.framework/Versions/A/RubyCocoa
>> dyld: loaded: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/libruby.1.dylib
Error: Couldn't read dependency list実行したコマンドと、アプリの起動時にロードした"ruby"という文字を含むライブラリを出力する。これは、アプリ内にコピーしても/System/Library/FrameworksのRubyCocoa.frameworkを使ってないかなどを確認するためだ。
失敗したときに確認すること
アプリ内のRubyCocoa.frameworkは意図したバージョンになっているか。
XcodeでビルドしたときにRubyCocoa.frameworkをアプリ内にコピー済みだとstandaloneify.rbは上書きしない。実行時の先頭の"INFO:"の内容で次のことを確認できる。
- コピーした。その場合のコピー元。
- すでにあったのでコピーしなかった。
- アプリ内のRubyCocoa.frameworkのバージョン。
"standaloneifying Ruby Version:"等が出力されているか。
このメッセージが表示されているときは、standaloneifyモードでアプリが起動されているので、そこは問題ないということがわかる。その場合はなんらかのrubyのエラーが出てるので、そこを中心に調べる。だいたいは、standaloneify.rbが利用しているrubygemsのバージョンに対応してないことが原因。
逆に表示されていないときは、アプリがstandaloneifyモードで起動できていないので、
あたりが疑わしい。
今回情報をいっぱい出すようにしたので、最新のstandaloneify.rbを使った上で失敗したときの出力メッセージをまるごと私あてにお知らせください。調べます。