捆绑 (macOS)

在NeXTSTEP、Mac OS X和GNUStep以及它们的直系子孫macOS和iOS中，捆绑（Bundle）是一个已預定好其結構及副檔名的目录，它允许相关资源被组合在一起，概念上可以当作一个单独文件看待。在Mac中，该特性在Mac OS 9中引入，被称为“包”（package），它类似于RISC OS和ROX Desktop中应用程序目录的特性，以及使用SpatialBundle技术的Ubuntu和Debian等Linux发行版。

应用程序，应用程序框架和插件通常以捆绑的形式将其内部文件组织在一起，同时，文档也可以构成框架。在NeXT的Foundation工具包和Cocoa的Foundation框架中，可以使用NSBundle类操作捆绑；在Core Foundation中，则使用CFBundle系列函数进行操作。

捆绑通常包含一个可执行代码文件和一些资源文件，例如NIB文件，图像，声音，本地化字符串，配置文件（通常是属性列表文件）和其它媒体。在其它系统上，例如Microsoft Windows，这些资源通常在编译时就被直接包含在了可执行文件中。Mac OS X从NeXTSTEP中引入了捆绑的概念，用以代替早期Mac OS中以资源分支存储附加元数据的技术。多数类型的捆绑在使用时与普通文件类似，从而减少了其内部文件意外更改或丢失的风险。同时，捆绑的另一个意义在于可以使用文件夹简化组织资源的方式，避免使用资源分支导致的额外的复杂性。

捆绑的统一类型标识符是com.apple.bundle，而包的则是com.apple.package。

Mac OS X中的应用程序捆绑

应用程序捆绑通常为软件包，以单一文件的形式出现在用户面前。这个“文件”实际上是一个以.app为扩展名的文件夹。辅助点按这个包，然后选择“显示包内容”，即可以文件夹的形式打开该捆绑并查看、修改其内容。对于应用程序，捆绑中的唯一一个一级子目录通常是Contents。在Contents中，通常有另外一些目录，包括可执行文件目录（在Mac中为MacOS，GNUStep中则为应用程序的名字），资源目录（Resources）等。资源目录中通常包含了程序所需的本地化资源，包括字符串文件（.strings文件），nib文件等等。

其它常见的子目录包括Plugins，Frameworks和Shared Frameworks。Frameworks包括了该程序使用的框架，程序运行时会首先查找此处的框架而不是优先使用系统提供的，可以在一定程度上避免类似DLL地狱的情况发生。Shared Frameworks目录包含了可以由本程序和其它程序使用的框架，同时，与Frameworks不同，只会在无法在系统中找到更新的版本时使用。Plugins目录则包含了程序使用的插件。

Mac OS X中的框架捆绑
Mac OS X中的框架也以捆绑的形式储存。框架中的动态库代码储存在与框架同名的文件中，放置于顶层目录中；顶层目录中也可能包含Headers，储存了该框架提供的头文件。

Mac OS X中的可载入捆绑
可载入捆绑即包含可以在运行时载入的代码的捆绑，其扩展名通常为.bundle，常常被用作插件。

其它捆绑格式
其它的一些捆绑包括包含图形的，以.rtfd为扩展名的RTF文件，Safari的下载未完成的文件等。GarageBand，Keynote，Pages，Numbers，iMovie和Xcode等程序的部分版本中，项目文件亦存储为捆绑。在iWork '09版中，其文件为一压缩的捆绑，可以将其解压后查看内部结构；另外，Microsoft Office 2007引入的新文件格式也采用了类似的技术。

苹果安装器包（.pkg）是包含pax归档文件的捆绑，参见Installer (Mac OS X)。

Linux发行版Super OS使用RUNZ格式的捆绑。

参考文献

参见
 Application Directory — RISC OS中的应用程序捆绑
 klik — 一个使用类似原理的Linux程序
 RUNZ
 SpatialBundle 采用“一个文件，一个程序”哲学的用于Linux的可移植程序

外部链接
 Bundle Programming Guide  at Apple Developer Connection
 NSBundle documentation  from the GNUstep project
 Platypus  — a tool to create application bundles around scripts
 Tech News  — new technology news information with reviews

MacOS