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を使った上で失敗したときの出力メッセージをまるごと私あてにお知らせください。調べます。