【问题标题】:Creating customized .dmg files upon download下载时创建自定义 .dmg 文件
【发布时间】:2010-12-24 22:06:32
【问题描述】:

我想分发一个跨平台应用程序,其可执行文件略有不同,具体取决于下载它的用户。这是通过在可执行文件中的某处放置一个占位符字符串来完成的,该字符串在下载时替换为用户特定的内容。

必须进行这些字符串替换的网络服务器是一台 Linux 机器。对于 Windows,可执行文件没有压缩在安装程序 .exe 中,因此字符串替换很容易。

对于未压缩的 Mac OS X .dmg 文件,这也很简单。但是,使用 gzip 或 bzip2 压缩的 .dmg 文件并不容易。例如,在后一种情况下,压缩的 .dmg 不是一个大的 bzip2 压缩磁盘映像,而是由几个不同的 bzip2 压缩部分(具有不同的块大小)和一个 plist 后缀组成。此外,使用 bzip2 解压和重新压缩不同部分不会产生原始数据,所以我猜测 Apple 对 bzip2 使用了一些与命令行工具不同的参数。

有没有办法在 Linux(没有 hdiutil)上从未压缩的 .dmg 生成压缩的 .dmg?或者也许是创建自定义应用程序而不预先生成它们的另一个建议?它应该可以在没有用户输入的情况下工作。

【问题讨论】:

  • 您是在问如何在 Linux 中重命名位于 .dmg 文件中的文件?
  • 否,替换 .dmg 文件中某处的以 null 结尾的字符串。
  • 为什么它需要放在 .dmg 文件中?
  • 是的,最好。我希望在用户安装它时弹出带有背景图像的 dmg 内容。但如果没有好的解决方案,我可能不得不使用 zip 文件。

标签: linux macos software-distribution dmg diskimage


【解决方案1】:

如果您的 Web 服务器和客户端支持 gzip 编码,那么您可以在服务器上处理未压缩的文件,但让它们分别由 Web 服务器/Web 客户端动态压缩/解压缩。

例如apache 的 mod_gzip。

否则也许你可以将你的 dmg 分成 3 部分:

  • 你想替换之前的东西

  • 要替换的字符串

  • 你想要替换的东西

    如果 gzip 流在这些点是可拆分的,您可以将前后连接到要替换的 gzip 字符串上。这样您就可以即时生成它。

【讨论】:

  • 我决定使用 hdiutil 创建一个只读图像 (UDRO),它最小化了大小但不压缩。对于大多数用户来说,它将通过 HTTP 压缩传输,我想我将不得不承担小磁盘空间的损失。
  • 嗯,事实证明这不起作用,因为只读图像具有校验和。而且我不能使用读写图像,因为 OS X 在挂载时不会自动弹出 .dmg 的内容。
【解决方案2】:

发布一个普通的、只读的、压缩的 dmg。然后将您的应用与设置所需变量的飞行前脚本捆绑在包安装程序中。

【讨论】:

    【解决方案3】:

    我意识到我在这里有点太晚了,但我们想做完全相同的事情并使用 libdmg 让它工作。 https://github.com/planetbeing/libdmg-hfsplus

    基本上,您可以使用 libdmg 将 dmg 文件解压缩为包含 hfs+ 文件系统的未压缩文件,在 hfs+ 文件系统中玩转文件,然后将其重新组合为具有正确校验和的 dmg 文件.

    如果您使用任何花哨的 dmg 功能,例如在安装映像之前显示 EULA,那么这些功能将无法在该过程中继续存在。不过,背景图片等也可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多