きりかノート 3冊め

おあそびプログラミング

standaloneify.rb トラブルシューティング

RubyCocoaに添付されてる便利スクリプト、standaloneify.rbで問題が起きたときの対処法。

standaloneify.rbとは

各種ライブラリ(.rb, .bundleなど)を.app内にパッケージして配布しやすくするツール。いつのころからかRubyCocoaに添付されてる。

わりと裏技的な実現方法を取ってるので、将来的にはGemfile使うとか別の手法に移行したい。

さいきんの変更

今日時点の最新版はSVNリポジトリの該当ファイルの"Download this file"あたりからどうぞ。

  • rubygems-2.1以降でも動作するようにした。
  • 実行時に情報をいっぱい出すようにした。

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