【问题标题】:Create DMG file [duplicate]创建 DMG 文件 [重复]
【发布时间】:2010-11-17 07:12:38
【问题描述】:

我正在用 Cocoa 开发一个应用程序。我需要创建一个 DMG 文件来安装我的应用程序,例如 Adium(它提供了一个很好的 UI 来将应用程序文件拖到应用程序文件夹)。有这个工具吗?

【问题讨论】:

  • 无论谁投票决定关闭它,我不同意这个 /necessarily/ 属于 SuperUser.com,只是因为有编程方式来完成它,而且它与编程比最终用户更相关,因为这是关于应用程序部署的。
  • 如果不是真的需要 DMG,请使用 zip。与 DMG 相比,这对新 Mac OS X 用户来说更容易混淆。

标签: cocoa deployment distribution diskimage


【解决方案1】:

如果您有一个用户可能会复制到应用程序目录的文件,那么“支持 Internet 的”磁盘映像是一个不错的选择。当您使用 Safari 下载一个(我知道,不是每个人都使用 Safari)时,它会自动安装它,将内容复制到下载位置,然后卸载 DMG 并将其移动到垃圾箱。应用程序不会自动转到应用程序,但它在用户的 HD 上,他们不必担心摆弄磁盘映像。

磁盘映像可以通过单个终端命令启用互联网:

hdiutil internet-enable -yes "MyDiskImage.dmg"

这应该适用于任何 DMG 文件。如果您希望用户看到您漂亮的背景,您可能不想这样做。但是,对于简单的有效载荷,这是一个不错的方法。 (当然,无论如何,有些人更愿意为这种部署创建一个 ZIP 文件。)


我发现手动创建 DMG 可能会很痛苦。您实际上可以在您的 Xcode 项目中自动创建一个简单的 DMG。只需创建一个 Shell 脚本目标(项目 → 新目标...)并在脚本中使用 hdiutil。该命令看起来像这样(替换正确的名称和目录):

hdiutil create -fs HFS+ -volname "MyApp 1.0" -srcfolder \
"/directory/with/contents/to/package/" "~/Desktop/MyApp-1.0.dmg"`

您需要将要包含在磁盘映像中的所有内容放在一个目录中,但如果您不怕在终端中使用cp,这很容易做到。

如果你想看一个例子,我自己在CHDataStructures.framework 中使用这种方法。如果您签出代码并在 Xcode 中打开,部署目标中的第二个脚本会创建 DMG。

【讨论】:

  • 唉,在 Mac OS X 10.2 到 10.6 中启用 Internet 的设置是 only followed。即使在那些版本上,它也几乎只有在 Safari 下载 .dmg 文件时才有效。
【解决方案2】:

磁盘工具(在 Applications\Utilities 中)

转到File > New > Disk Image From Folder,然后选择要为其创建图像的文件夹。生成的 .dmg 将复制您用于制作图像的文件夹,直至图标的位置。

【讨论】:

  • 说真的,既然有这个方便的实用程序,为什么还要为共享软件付费?
  • 此方法实际上并不保留顶级图标位置和视图选项。
  • @MichaelTsai 是的,您需要定位所有内容,然后从磁盘工具将其转换为压缩文件,还要创建一个背景图像创建一个名为.background 的文件夹,将您的图像放在那里,打开调高音量,按cmd+j,然后标记Background:Picture,然后将.background 中的文件拖入其中。这必须在将其转换为压缩(只读)图像之前完成。
  • @MostafaTorbjørnBerg 上面的答案说使用磁盘工具命令将复制文件夹中的图标布局。这是不正确的。您必须在创建 .dmg 后手动定位所有内容(每次创建 .dmg),然后必须将其转换为压缩格式。
  • @MichaelTsai 哦,对不起,我误解了你,你是 100% 正确的 :)
【解决方案3】:

博士。 Nic 组装了一个漂亮的 ruby​​ gem,它可以为您完成大部分工作,您只需要提供 xcode 项目和一些图形。链接在这里:

http://drnicwilliams.com/2009/02/03/choctop-packaging-and-deployment-of-cocoa-applications/

这是一个很棒的包,可以处理原本很痛苦的任务......

-- 埃文

【讨论】:

  • 感谢您提及这一点,正是我想要的。
  • 不得不提的是,这个工具创建的 dmg 的总大小增加到了 10M。
  • 这看起来很有希望,但是所有的图像和视频都是死链接,源最后一次更新是在 7 年前,它说它需要 Sparkle... ?
【解决方案4】:

因为已经没有足够的答案了......

我创建了一个具有我想要的布局的读写 DMG——背景图像、大小、应用程序图标的快捷方式以及一个空文件夹来代替我的应用程序。我编写了一个简单的bash 脚本来制作此 DMG 的副本,挂载它,将我的应用程序复制到空文件夹中,卸载 DMG,然后将其转换为只读。

但是 DMG Canvas 可以为您完成整个过程,并且还提供了一个命令行工具,您可以使用该工具从您的 Xcode 构建中自动执行此过程,所以我真的建议在我的解决方案中使用它。

【讨论】:

    【解决方案5】:

    Mozilla build scripts 是一个很好的来源,如果您想编写自己的脚本。使用pkg-dmg,您可以自定义背景图片、卷名、添加许可证、图标等。示例:

    pkg-dmg \
        --verbosity 2 \
        --volname "MegaFinder" \
        --source MegaFinder.app \
        --sourcefile \
        --target MegaFinder.dmg \
        --license Licence.txt  \
        --icon MegaFinderVolumenIcon.icns  \
        --copy MegaFinderCustomizedDS_Store:.DS_Store \
        --mkdir .background \
        --copy MegaFinderBackgroundImage.jpg:.background/backgroundImage.jpg \
        --symlink  /Applications:Applications \
        --attribute V:.background \
        2>&1 > /dev/null
    

    问题在于创建完美的.DS_Store。对于简单的情况,您可以创建 .DS_Store 在 Finder 中自定义安装的 dmg 卷(显示视图选项)。您需要创建一个可写映像,对其进行自定义,卸载(提交更改),最后再次安装以将生成的.DS_Store 复制为MegaFinderCustomizedDS_Store(如上例所示)

    如果您的应用支持 Leopard,我建议使用 DMG Canvas 来管理整个流程或至少获取 .DS_Store。它也有一个命令行工具。

    【讨论】:

    【解决方案6】:

    将其作为自动构建步骤执行此操作的最佳方法是创建一个看起来完全符合您需要的 template.dmg(使用 finder/diskutility 等,但不执行压缩它的最后一步),然后在您的构建脚本中:

    1. 使用 hdiutil 附加图片
    2. 使用 cp 等将应用程序复制到挂载的映像中
    3. hdiutil 分离
    4. 压缩图像:hdiutil convert "in.dmg" -quiet -format UDZO -imagekey zlib-level=9 -o "MyApp-0.3.dmg"

    https://github.com/remko/fancy-dmg/ 有一个包含这些步骤的 makefile。

    【讨论】:

      【解决方案7】:

      MacBreak Dev 做了一个关于使用 Automator 工作流程创建 DMG 文件的精彩小截屏视频。使事情变得非常简单,非常快速,您可以为 DMG 设置自定义背景。您可以在以下位置看到它: http://www.pixelcorps.tv/mbkd_010

      【讨论】:

      • 不幸的是,链接似乎不再起作用了。
      【解决方案8】:

      您可以使用DropDMG 设置带有背景图片、指向应用程序文件夹的符号链接、图标位置等的布局。然后,当您需要制作 .dmg 文件时,只需拖动应用程序即可到 DropDMG(或通过 AppleScript 或 dropdmg 命令行工具编写脚本)并让它一步构建磁盘映像。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        相关资源
        最近更新 更多