2009-12-09 26 views
6

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

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

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

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

+0

你问的是如何重命名一个存在于Linux中的.dmg文件中的文件? – Seth 2009-12-09 18:10:54

+0

不,用.dmg中的某个文件内的某处替换空终止的字符串。 – Marten 2009-12-10 10:54:13

+0

为什么它需要在.dmg文件中? – 2009-12-12 01:54:48

回答

0

如果您的网络服务器和客户端支持gzip编码,那么您可以处理服务器上的未压缩文件,但可以通过Web服务器/ Web客户端分别对其进行压缩/解压缩。

例如apache的mod_gzip。

否则也许你可以将伤害分为3个部分:

  • 的东西,你要替换
  • 什么之前,你希望字符串替换
  • 的东西,你要替换一下后

    如果gzip流在这些点上是可拆分的,则可以将正面和背面连接到要替换的gzip字符串上。这会让你在飞行中产生它。

+1

我决定使用hdiutil创建一个只读图像(UDRO),它将尺寸最小化但不压缩。对于大多数用户来说,它将通过HTTP进行gzip传输,我想我将不得不承担小磁盘空间的惩罚。 – Marten 2009-12-10 10:17:28

+1

嗯,事实证明这是行不通的,因为只读图像有校验和。而且我无法使用读写图像,因为OS X在挂载时不会自动弹出.dmg的内容。 – Marten 2009-12-11 11:40:04

0

发布正常的只读压缩dmg。然后将您的应用程序捆绑到程序包安装程序中,并使用预先创建的脚本来设置所需的变量。

5

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

基本上,你可以使用libdmg才能解dmg文件包含一个HFS +文件系统中的未压缩文件,玩的HFS +文件系统里的文件,并把它重新结合在一起作为与DMG文件正确的校验和。

如果您使用任何奇特的dmg功能,例如在映像安装之前显示EULA,那么这些功能将无法在该过程中存活。不过,背景图像等等工作。