web-dev-qa-db-ja.com

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

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

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

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

どうもありがとう :-)

3
Ben Everard

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

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

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

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

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

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

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

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

alt text

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

両方のアイテムのFSCatalogInfoレコードを詳しく調べた後、問題が何であるかがわかりました。

alt text

上の画像では、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は、finderInfo.finderFlagskIsAliasフラグに対応します。その値は/System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.hで定義されています。

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

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

6
NSGod

Zipヘルプの読み取り:

-yシンボリックリンクを、参照ファイルではなくリンクとして保存します

3
Pete Ashdown