在 Mac OS X 下为程序打包该用什么格式?这是个很有趣的问题,首先,显然绝大部分的应用程序都应该:
* 使用手动安装,也就是一个独立的 `.app`,里面通过 `@executable_path/../Frameworks/` 的方式[链接所有依赖的第三方库](http://www.cocoadevcentral.com/articles/000042.php),也就是说,不往系统相关目录里乱放东西。这是 Apple 官方的 Software Delivery Guide 中[推荐的安装方式](http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/Introduction/Introduction.html)。
* 支持用 Sparkle 这样的自动更新框架,实际上符合上一点的也就自然可以用 Sparkle 完全自动的完成更新。
* 用 `.zip` 格式分发。为什么不用 `.dmg`?因为 `.dmg` 不容易直接解压,挂载速度比 `.zip` 慢得多,增加拖动的手续,所以我支持这篇 [zip vs dmg](http://0xced.blogspot.com/2006/11/zip-vs-dmg.html) 的观点。
但是如果遇到特殊的情况呢?比如你写的是一个**非得**往系统目录 (`/Library/…`) 安装内容的软件呢?比如我最近参与改进的 [SunPinyin 输入法](http://blogs.sun.com/yongsun/entry/sunpinyin_for_mac_leopard_updated6),就必须打包为 Installer 支持的 `.pkg` 格式安装了,否则很难确保软件被正确的安装。
关于这个打包方式,最重要的一点心得是:千万不要用 Apple 自己提供的 [PackageMaker](http://developer.apple.com/DOCUMENTATION/DeveloperTools/Conceptual/PackageMakerUserGuide/index.html),这恐怕是 Apple 开发的最恐怖的一个开发辅助工具了,因为:
* 它必须用图形界面修改内容
* 它保存的 `.pmdoc` 格式非常混乱,而且居然喜欢把*绝对路径*存入文件中
* 不支持 [Installer Plugins](http://developer.apple.com/samplecode/InstallerPluginSample/listing1.html) 扩展
那替代的工具是什么呢?是一个非常棒的第三方工具: [Iceberg](http://s.sudre.free.fr/Software/Iceberg.html),它能:
* 打包出 Mac OS X 10.2+ 以上都支持的 `.pkg` bundle 格式
* 界面比 PackageMaker 友好得多,而且有非常详尽的文档,也很方便调试
* 支持 Installer Plugin
涉及打包、Sparkle 的 appcast 自动生成,Iceberg 的使用等问题,都可以参考 SunPinyin [目前使用的代码](http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin/ime/wrapper/macos/packaging/)。