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[1],其副檔名通常為.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).