Bundle
Bundle是NeXTSTEP、macOS、iOS、GNUstep等操作系統中使用的資源組織形式。它通過一種固定了文件名和文件結構的目錄形式,將相關資源組合在一起,使這些資源可以像一個獨立文件一樣來訪問和操作。一個Bundle通常包含一個可執行代碼文件和一些資源文件,例如NIB文件,圖像,聲音,本地化字符串,配置文件(通常是屬性列表文件)和其它媒體等。
副檔名 |
.app, .framework, .kext, .plugin, .docset, .xpc, .qlgenerator, .component, .saver, .mdimporter, etc. |
---|---|
統一類型標識 | com.apple.bundle |
作為容器 | 執行檔、元資料、其他的捆綁、任何其他在執行程式時需要的檔案。 |
在其他操作系統中,例如Windows,這類資源通常在編譯時就被直接包含在了可執行文件中,或者需要與可執行文件一樣保存到專門的文件夾中,增加了文件意外更改或丟失的風險,而Bundle使用文件夾來簡化組織資源,使用戶可以像使用普通文件一樣使用Bundle,避免了這種複雜性。
在Mac OS 9中,該特性被稱為「包」(package),而Mac OS X從NeXTSTEP中引入了Bundle的概念,用於取代該技術。在NeXTSTEP以及後續的Mac OS X等操作系統中,應用程序、應用框架和插件通常以Bundle的形式將其內部文件組織在一起。在NeXT的Foundation工具包和Cocoa的Foundation框架中,可以使用NSBundle類操作Bundle;在Core Foundation中,則使用CFBundle系列函數進行操作。
Bundle的統一類型標識符是com.apple.bundle,而包的則是com.apple.package。
Mac OS X中的應用程序Bundle
應用程序Bundle通常為軟件包,以單一文件的形式出現在用戶面前。這個「文件」實際上是一個以.app為擴展名的文件夾。輔助點按這個包,然後選擇「顯示包內容」,即可以文件夾的形式打開該Bundle並查看、修改其內容。對於應用程序,Bundle中的唯一一個一級子目錄通常是Contents。在Contents中,通常有另外一些目錄,包括可執行文件目錄(在Mac中為MacOS,GNUStep中則為應用程序的名字),資源目錄(Resources)等。資源目錄中通常包含了程序所需的本地化資源,包括字符串文件(.strings文件),nib文件等等。
其它常見的子目錄包括Plugins,Frameworks和Shared Frameworks。Frameworks包括了該程序使用的框架,程序運行時會首先查找此處的框架而不是優先使用系統提供的,可以在一定程度上避免類似DLL地獄的情況發生。Shared Frameworks目錄包含了可以由本程序和其它程序使用的框架,同時,與Frameworks不同,只會在無法在系統中找到更新的版本時使用。Plugins目錄則包含了程序使用的插件。
Mac OS X中的Frameworks
Mac OS X中的Frameworks(框架)也以Bundle的形式儲存。框架中的動態庫代碼儲存在與框架同名的文件中,放置於頂層目錄中;頂層目錄中也可能包含Headers,儲存了該框架提供的頭文件。
Mac OS X中的可載入Bundle
Bundle的其它形式
其它Bundle包括包含圖形的,以.rtfd為擴展名的RTF文件,Safari的下載未完成的文件等。GarageBand,Keynote,Pages,Numbers,iMovie和Xcode等程序的部分版本中,項目文件亦存儲為Bundle。在iWork '09版中,其文件為一壓縮的Bundle,可以將其解壓後查看內部結構[2];另外,Microsoft Office 2007引入的新文件格式也採用了類似的技術。
蘋果安裝器包(.pkg)是包含pax歸檔文件的Bundle,參見Installer (Mac OS X)。
參考文獻
- ^ Code Loading Programming Topics for Cocoa: About Loadable Bundles 網際網路檔案館的存檔,存檔日期2008-09-05.
- ^ Open iWork' 09 flat files as folders. [2010-10-15]. (原始內容存檔於2009-02-27).