OSXでファイルを圧縮し、シンボリックリンクを「解決」したい

OSXでファイルを圧縮し、シンボリックリンクを「解決」したい

ディレクトリはいくつかありますが、それらはすべて私が作成した Web スクリプトのデモです。重要な点は、それらはすべてリソースを共有しているということです。そこで、グローバル リソース ディレクトリを作成し、そのディレクトリを各デモ フォルダーにシンボリック リンクしました。

私がやりたいのは、各デモ ディレクトリをファイルに圧縮することです.zipが、問題は、シンボリック リンクが zip ファイル内に保持され、別のマシンではリソース ディレクトリが存在しないということです。

デモ フォルダーをシンボリック リンクを解決して zip ファイルに圧縮し、解凍したときにファイルが標準のファイル構造の一部であるかのように表示する方法はありますか?

どうもありがとう :-)

答え1

質問がいくつかあります。1) アーカイブするフォルダー構造は、スペースを節約するために内部でシンボリック リンクを使用していますか? (「内部」とは、特定のルート フォルダーがある場合、そのルート フォルダー内のシンボリック リンクは、そのフォルダー内にある他のファイルまたはディレクトリのみを参照することを意味します)。

2) OS X で .zip アーカイブをどのように作成していますか? (コマンドライン ツールを使用していますか? 使用している場合はどのツールですか? または、Archive Utility などを使用していますか?)

3) ターゲット コンピューター (アーカイブを解凍する場所) で実行されているオペレーティング システムは何ですか。また、そこでファイルを解凍するためにどのような方法を使用していますか。

まず、OS X では、シンボリック リンクは基本的にプレーン テキスト ファイルであり、OS X にファイルをシンボリック リンクとして扱う必要があることを知らせる追加の「Mac」情報が含まれています。この追加の Mac 情報は、特殊なファイル タイプ、作成者コード、および Finder フラグ情報であり、ファイル自体ではなく、HFS+ ディスク ディレクトリに保存されます。

OS X では、.zip ファイルを作成すると、zip ストリームにこの追加の Mac 情報のためのスペースがないため、ある意味では、シンボリック リンクは zip ファイル内にプレーン ファイルとして保存されます。別の Mac のユーザーがアーカイブを解凍して、元の構造を適切に表すことができるかどうかは、誰が、または何を使用して解凍するかによって決まるようです。

たとえば、1 か月ほど前、ある会社が Valve のゲーム配信ソフトウェアである Steam でゲームをリリースしました。このゲーム アプリケーション バンドルには、内部でシンボリック リンクを使用するフレームワークの形式で NVIDIA の Cg ライブラリが含まれていました。このスレッドで言及されているように、当初は、Steam が Trine.app に必要な Mac 情報を適切に復元しないという問題がありました。 http://forums.steampowered.com/forums/showthread.php?t=1556083

下の画像は、Cg.framework の 2 つの異なるコピーを示しています。1 つは NVIDIA の Web サイトから別途インストールしたもの (上の画像)、下の画像はゲームと一緒に受け取ったものを示しています。

代替テキスト

すべての項目が一致していますが、シンボリック リンクであるはずのものがプレーン データ ファイルになっていることに注意してください。

両方の項目の FSCatalogInfo レコードを詳しく調べたところ、問題が何であるかが明らかになりました。

代替テキスト

上の画像を見ると、finderInfo 構造体の先頭に次の値があることがわかります。

0x736C6E6B = 'slnk'
0x72686170 = 'rhap'

これらの値は /usr/include/hfs/hfs_format.h で定義されています。

/*
 *  File type and creator for symbolic links
*/
enum {
    kSymLinkFileType  = 0x736C6E6B, /* 'slnk' */
    kSymLinkCreator   = 0x72686170  /* 'rhap' */
};

9 番目のバイト値 0x80 は、kIsAliasのフラグに対応しますfinderInfo.finderFlags。その値は、/System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h で定義されています。

enum {
    kIsAlias                      = 0x8000 /* Files only */
};

OS X に組み込まれている unzip 機能 (アーカイブ ユーティリティ) は、解凍中のアーカイブ内でシンボリック リンクを表す可能性のあるファイルを検索し、その情報を適切に設定するようにハードコードされているようです。(ファイルをアーカイブする機能に使用する場合) この機能によって、これも自動的に処理されると思います。そうであるかどうか/usr/bin/dittoはわかりません。zipunzip

答え2

これは Info-ZIP のデフォルトの動作です。代わりにアーカイブ内にシンボリックリンクを保存するには、またはをzip渡す必要があります。-y--symlinks

答え3

Zip ヘルプには次のように書かれています:

-y 参照ファイルの代わりにシンボリックリンクをリンクとして保存します

関連情報