タイトル【小池邦人のプログラミング日記】2000/10/11<パッケージの秘密を探る>カテゴリーMac OS 9, Mac OS X, 小池邦人のプログラミング日記
作成日2000/10/11 16:6:29作成者小池邦人
Mac OS Xの環境について良く尋ねられる質問に「リソース・フォークはどうなるの?」というのがあります。この質問に対する答えは「まだある」が正しいのですが、以下のAppleサイトからダウンロードできる「Inside Mac OS X System Overview」(PDFファイル名はSystemOverview.pdf)を読んでみると、その将来には暗い影がちらついています。

◇Inside Mac OS X System Overview
 http://developer.apple.com/techpubs/macosx/macosx.html

そこで、リソースが大きく関わっているアプリケーションのパッケージ化について、Mac OS 9とMac OS Xの両環境で調べてみることにしました。Apple社は年々増加するアプリケーションの関連ファイル(共有ライブラリ、Plug-inファイル、ヘルプ用コンテンツ、辞書ファイル等)をすっきりまとめるために、Mac OS 9から(8.6から?)「パッケージ」という仕組みを導入しました。この仕組みは単純です。アプリケーションとそれに関連するファイルを、あるルールに従いひとつのフォルダ内にまとめ、ユーザからはひとつのアプリケーションファイルとしか見えないようにしてしまいます。つまりMac OS 9のFinderが、パッケージ化されたフォルダ表示を内蔵アプリケーションのアイコンへ切り替え、アプリケーションの起動も、それのダブルクリックにより実行してくれるわけです。技術的には、フォルダ(ディレクトリ)のDInfo構造体のfrFlags(Finder Flag)のHasBundleビットがONだとパッケージ化されたフォルダだと識別されます。当然、パッケージの仕組みがサポートされていない旧Mac OSの環境へコピーすれば、それは単なるフォルダとしか見なされません。

Mac OS 9でパッケージ化を行うには「CarbonLib 1.0.4 SDK」の「Sample Code」フォルダに含まれている「PackageTool」を利用すると簡単です。



このアプリケーションは、ダイアログへドラッグ&ドロップしたフォルダをラジオボタンの切り替えでパッケージ化することができます。



サンプルフォルダには、パッケージ化用のサンプルとして、「HTMLSample」というアプリケーション(既にパッケージかされている)も含まれていますので試してみてください。



まずは、HTMLSampleのパッケージを解除して、パッケージのフォルダ内構造がどうなっているか調べてみるのが近道です。最初の階層にアプリケーション本体のエイリアスが存在していることがわかります。これにより、アプリケーション本体はフォルダ内のどの階層に存在していてもかまわなくなります。よって、共有ファイルやPlug-inファイルのように、その保存位置がアプリケーションの階層に依存しているファイルもまとめて整理することができるわけです。



それではMac OS 9環境でパッケージ化したアプリケーションは、そのままMac OS X Public Betaでもパッケージとして認識されるのでしょうか?実験してみたところ、パッケージとしてではなく、ドキュメントとして認識されてるようなのです?(アイコンも付かない)ダブルクリックすると何故だかMac OS X付属のTextEditが起動してしまいます?



それならということで、Mac OS X上でPackageToolを起動して(このアプリはCarbon化されている)その場でパッケージ化してみると、作業自体は問題なく終了するのですが、やはりダブルクリックでは起動できません。Mac OS X Finderには、旧パッケージの取り扱いが完全にインプリメントされていない雰囲気です。よって、旧パッケージフォーマットが、そのままMac OS Xでも利用できるのかどうかの疑問は謎のまま残ってしまいました。

今度はMac OS X側でのパッケージ構造がどうなっているのかを調べてみました。Mac OS Xでは、関連ファイルをフォルダにまとめる仕組みを「バンドル」と呼び、そうしてまとめられた物を「アプリケーションパッケージ」と呼ぶようです。調べてみると、そのバンドル方法がMac OS 9とは大きく異なっています。詳しい仕組みはSystem Overviewを参照してもらうとして、なんとクリエータとタイプも別テキストファイルに持たせ、加えてバンドルの様々な情報をXMLで記載した「情報プロパティリスト」というテキストファイルも用意する必要があるようです。



Mac OS 9では、Finderの情報ダイアログで「アプリケーションパッケージ」と表示されますので、フォルダとパッケージは簡単に区別できます。しかし、Mac OS X ではそうした区別は無いようです。Mac OS XのNativeアプリケーションがパッケージ化されているかどうかを調べるのには、そのアイコンをResEditにドロップしてみます。ResEditが起動するだけで、その後に何も起こらなければ、それはフォルダ(つまりパッケージ)であると判断できます。

Mac OS Xのパッケージ構造を調べるのには、それをMac OS 9上にコピーしてきます。例えば、付属の「Internet Explorer」をMac OS 9上にコピーしてみましょう。Mac OS XパッケージはMac OS 9へ持ってくると魔法が解けてただのフォルダに戻ってしまいます(笑)。



System Overviewによると、バンドルでのリソースは個別ファイルとしてデータ・フォークに格納するように指示しています。確かにInternet Explorerの場合、Mac OS Xで利用する大サイズアイコンは個別リソースとしてデータ・フォークに格納されているようです。同様にSystem Overviewでは、ローカライズ用のリソースはリソース・フォークではなくデータ・フォークに格納するよう記載されています。(CoreFoundationにあるBundle APIとResource Managerでアクセスできるらしい)しかし、Internet ExplorerパッケージのEnglish.lproj内にあるInternet Explorer.rerc(アプリで使う大部分のリソース)は、何故だか今まで通りリソース・フォークに格納されています?



また、共有ファイルやPlug-inも指定フォルダに納められているはずですが、このパッケージではアプリケーションと同階層に集められています。なにやら、Mac OS 9とMac OS Xの和洋折衷状態となっています。



と言うわけで、Mac OS X Public Betaでは、とりあえずアプリケーションパッケージ内でもリソース・フォークに保管したリソースは利用できています。はたして、この仕様は実装途中の物であり、最終的にはSystem Overviewの内容に到達するのか?それとも、現状のMac OS 9寄りでこのまま固定されるのか?今後の展開に注目してみたいと思います。
[小池邦人/オッティモ]
関連リンクオッティモ