TitaniumのインクルードパスをResourcesからの相対パスで指定する方法

2011/02/27追記

Ti.includeではなくrequireを使えば以下の黒魔術は必要ない。
あとAndroidでは元々このインクルードパスの問題はないそうだ。

2011/07/24追記

MobileSDK1.7からiOSでも絶対パスでTi.includeできるようになったのでこの技は過去の歴史のひとつとなりました。

本家のQ&Aで黒魔術っぽいやり方を見つけた。
以下のように指定するとどの場所にあるファイルでTi.includeしても確実にファイルをインクルードできる。

Ti.include("../../../../../../../../../lib/bookmark.js")

ログは以下のようになる。

[DEBUG] include url: file://localhost/lib/bookamrk.js

「../」の数は多くても問題ない。少ないと問題がある。

Ti.include("../../../../../../../../../../../../../../../../../../lib/bookmark.js")
#=> [DEBUG] include url: file://localhost/lib/bookmark.js

理屈

Ti.includeの基準のディレクトリはTi.includeを実行したファイルのディレクトリで、例えばapp.jsだと以下のような位置になる。

file://localhost/Users/akahige/Library/Application%20Support/iPhone%20Simulator/4.2/Applications/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/Sample.app/

だが、ディレクトリをさかのぼりまくると最後はそれ以上はさかのぼれなくなり、最終的にfile://localhost/からの相対パス指定に落ち着く。
そしてそれがなぜか通るので上記のようなインクルードの指定が可能になっている。
「../」が少ないと中途半端なパスからの読み込みになってしまい、うまくいかないというわけだ。

まさにバッドノウハウ。

参考

TitaniumのインクルードパスをResourcesからの相対パスで指定する方法” に対して1件のコメントがあります。

コメントは受け付けていません。