创建DMG文件

19

我正在使用Cocoa开发一个应用程序。我需要创建一个DMG文件,以像Adium一样安装我的应用程序(提供漂亮的UI将应用程序文件拖到应用程序文件夹中)。是否有相应的工具可供使用?


7
对于投票关闭此问题的人,我不同意这一点/necessarily/属于SuperUser.com,仅仅因为有编程方法可以完成它,并且与终端用户相关性更大,因为这是关于应用程序部署的。 - Quinn Taylor
1
如果不是必须使用DMG格式,可以使用zip格式。对于新的Mac OS X用户来说,这比使用DMG格式更加清晰易懂。 - user142019
8个回答

19
如果您有一个单一的文件,用户可能会将其复制到应用程序目录中,那么"启用互联网"磁盘映像是一个不错的选择。使用Safari(我知道,不是每个人都使用Safari)下载后,它会自动挂载磁盘映像,将内容复制到下载位置,然后卸载DMG并将其移动到垃圾箱。应用程序不会自动进入应用程序,但它在用户的硬盘上,他们不必担心处理磁盘映像。
可以使用单个终端命令使磁盘映像启用互联网:
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。


2
唉,启用互联网设置仅适用于Mac OS X 10.2到10.6。即使在这些版本上,它也基本上只在使用Safari下载.dmg文件时才起作用。 - Michael Tsai

17

磁盘工具 (位于应用程序\实用工具中)

前往 文件 > 新建 > 从文件夹创建磁盘映像,然后选择要创建映像的文件夹。生成的 .dmg 文件将复制您用来制作映像的文件夹,包括图标位置。


2
说真的,为什么要购买共享软件,当有这个方便的实用工具呢? - Philippe
这个方法实际上并没有保留顶层图标位置和视图选项。 - Michael Tsai
@MichaelTsai,是的,你需要先定位所有内容,然后使用Disk Utility将其转换为压缩文件。同时,要创建一个背景图片,请创建一个名为".background"的文件夹,并在其中放置你的图片,打开卷后,按下“cmd+j”键,标记为“Background:Picture”,然后将".background"文件夹中的文件拖入其中。这必须在将其转换为只读压缩文件之前完成。 - Mostafa Berg
@MostafaTorbjørnBerg 上面的答案说使用Disk Utility命令将复制文件夹中的图标布局。这是不正确的。每次创建.dmg后,您都必须手动定位所有内容,然后将其转换为压缩格式。 - Michael Tsai
@MichaelTsai 噢,抱歉我误解了你,你是100%正确的 :) - Mostafa Berg

8

谢谢你提到这个,正是我正在寻找的。 - Lou Zell
我必须提到,由此工具创建的 dmg 的总体大小会增加到 10M。 - Bojan Babic
这看起来很有前途,但所有的图片和视频都是失效链接,源代码最后更新于7年前,而且它说需要Sparkle... - Ky -

3

由于现有的答案不够,我创建了一个可读写的DMG,其中包含我想要的布局——背景图片、大小、应用程序图标的快捷方式和一个空文件夹代表我的应用程序。我编写了一个简单的bash脚本来复制这个DMG,挂载它,将我的应用程序复制到空文件夹中,卸载DMG,然后将其转换为只读。

但是DMG Canvas可以为您完成整个过程,并提供一个命令行工具,您可以从Xcode构建中自动化此过程,因此我真的建议您使用DMG Canvas而不是我的解决方案。


2
Mozilla构建脚本是编写自己的脚本的绝佳资源。使用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文件。对于简单的情况,您可以通过在Finder中自定义挂载的dmg卷(显示视图选项)来创建.DS_Store。您需要创建一个可写的映像,进行自定义,卸载(以提交更改),最后再次挂载以将生成的.DS_Store复制为MegaFinderCustomizedDS_Store(如上例所示)。
如果您的应用程序支持Leopard,则建议使用DMG Canvas管理整个过程或至少获得.DS_Store。它还有一个命令行工具。

更新 Mozilla 脚本源链接:http://hg.mozilla.org/mozilla-central/file/tip/build/package/mac_osx - ash
@ash的链接现在也失效了。我已经在答案中更新了所有3个链接。 - Ky -

1
作为自动构建步骤的最佳方法是创建一个模板.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。

0

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


0

MacBreak Dev做了一个不错的小型屏幕录制,介绍如何使用Automator工作流创建DMG文件。这使事情变得非常容易、非常快捷,而且您可以为DMG设置自定义背景。您可以在http://www.pixelcorps.tv/mbkd_010中查看它。


很遗憾,链接似乎已经失效了。 - Cragly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接