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).