【发布时间】:2012-08-15 12:39:40
【问题描述】:
我的公司提供了一个包含几个基于 Qt 的 MacOS/X GUI 应用程序的软件包;该软件包以 .dmg 文件的形式提供,“安装”包括双击 .dmg 图标,然后将一个或多个应用程序图标拖到他想要保留它们的位置(例如,拖到他自己的 Applications 文件夹)。
这很好用,但是 .dmg 文件相当大(例如 40+MB),我想尽可能减小它的大小,以减少下载它所需的时间。我注意到的一件事是,包中的应用程序都有大量共同的大文件(Qt 库、图形资源文件等),目前我们在 blah.xml 中包含每个文件的单独副本。每个包含的应用程序的 app/Contents 文件夹——大概这就是 .dmg 文件如此大的原因。
所以我的问题是,有什么方法可以修改 .dmg 以便它不需要包含这些文件的多个副本,因此不是那么大?理想情况下,我希望这样做不需要用户运行特殊的安装程序,并且如果用户将它们移动到不同的(或意外的)文件夹或删除它们中的任何一个,也不会导致任何应用程序中断。
这似乎是硬链接的理想应用程序 - 即准备 .dmg 文件的输入,以便一个应用程序包含实际文件,而其他应用程序包含指向这些文件的硬链接,以便在用户从 .dmg 文件中解压应用程序后,这些文件在逻辑上保持相互独立(特别是如果用户移动或删除应用程序 A,应用程序 B 不会停止工作)。但是 AFAICT MacOS/X 不支持未命名为 Time Machine 的应用程序的硬链接 [编辑:到目录]。 :^(
【问题讨论】:
-
您能否详细说明“MacOS/X 不支持硬链接”的含义?我只是在终端中输入了“ln somefile samefile”,但我看不出硬链接在什么意义上不受支持。
-
啊,也许它只是指向 MacOS/X 不支持的目录的硬链接。来自维基百科:“为了防止无休止的递归,大多数现代操作系统不允许目录上的硬链接。此外,目录上的硬链接会导致父目录条目的不一致。一个值得注意的例外是 Mac OS X v10.5 (Leopard) 和更新版本,它们使用目录上的硬链接仅用于 Time Machine 备份机制。”尽管如此,作为 .dmg 创建过程的一部分,指向文件的 IIRC 硬链接会变成单独的副本,因此不会减小 .dmg 的大小。
-
然后一个选项是让 DMG 读写并在 DMG 上创建共享,可能在完全填满之前(在最后一步保留一些唯一文件以在 DMG 上复制,之后手动将相同的文件硬链接到另一个)。
-
嗯,在运行测试后,我对 hdiutil 关于硬文件链接的行为似乎是错误的......具有大文件的目录和指向该文件的硬链接不会不 创建一个比仅使用大文件更大的 .dmg 文件。所以也许我有我的解决方案:^) ...这对于大文件(如 Qt 库)来说效果很好,但对于包含许多小文件的目录来说会有点尴尬。
-
如果您将硬链接文件复制到图像,那么您可能会多次物理复制它们,但如果您复制一个文件然后在图像中创建硬链接,它应该可以工作。 OsX 在文件系统级别支持硬链接和软链接(Finder 和标准的打开/保存对话框有时会出现软链接问题,尤其是指向目录的软链接。此外,某些应用程序可能会出现软链接问题。但硬链接还可以)。如果您知道如何创建目录,则支持硬链接,因为它们可以工作,但是 AFAIK 没有记录的 API 可以做到这一点。