如何以编程方式(最好是 bash)将图标添加到 dmg?

how to programmatically (preferably bash) add icon to dmg?

我有一个 bash 脚本,可以为我的 node.js 应用程序创建一个 .dmg。但是,出现在 Finder 中的 .dmg 图标是标准磁盘图标。我需要它与应用程序的图标相同。

我知道我可以 cmd+I 在 Finder 的 .app 上,复制图标,然后 cmd+I 在我的 .dmg 上并粘贴。但我希望我的构建过程完全自动化。我不想为此使用第三方工具,因为我的 bash 脚本中已经有代码签名和本地化工作。

我已经尝试将我的 icns 作为 .VolumeIcon.icns 复制到我的 dmg 的根目录中。没有效果。

我也试过SetFile -a C "path/to/dmg/.VolumeIcon.icns"。这也没有任何效果,并且 man SetFile 表示它已被弃用。我在 macOS Sierra 10.12.6 上构建。

既然简单的复制和粘贴就可以工作,那么一定有办法以编程方式执行此操作!但是怎么办???

更新

部分有效:

hdiutil create -srcfolder "my/build/dir" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -volname MyAppName -ov -attach "my/output/dir/MyAppName.uncompressed.dmg"
SetFile -c icnC "/Volumes/MyAppName/.VolumeIcon.icns"
SetFile -a C "/Volumes/MyAppName"

它没有将图标与 .dmg 文件本身相关联,但是如果我双击 .dmg 文件,显示的 Finder window 有我的图标。

不过,最主要的需求是 .dmg 文件本身。当有人下载​​我的 .dmg 时,我需要下载文件夹中的 .dmg 文件有我的图标而不是标准磁盘图标。如上所述,这很容易手动完成,但我如何从 bash 脚本或 AppleScript 中完成它?

您可能缺少执行 SetFile 命令之前的一步。试试这个。

SetFile -c icnC "path/to/dmg/.VolumeIcon.icns"
SetFile -a C "path/to/dmg"

这里有更多信息:http://docplayer.net/20858155-How-to-create-a-yosemite-installer.html

假设您有这样的图片

保存为:cc.png。执行以下操作

cp cc.png cc_copy.png
sips -i cc_copy.png
DeRez -only icns cc_copy.png > icns.rsrc
mkdir some_installer
hdiutil create -volname installer -srcfolder ./some_installer -ov -format UDZO my_app.dmg
Rez -append icns.rsrc -o my_app.dmg
SetFile -a C my_app.dmg

你最终会得到:

这是你要找的吗?

更新:

也应该适用于 icns

cp /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/macOS.icns .
cp macOS.icns macOS_copy.icns
sips -i macOS_copy.icns
DeRez -only icns macOS_copy.icns > icns.rsrc
hdiutil create -volname installer -srcfolder ./some_installer -ov -format UDZO my_app.dmg
Rez -append icns.rsrc -o my_app.dmg
SetFile -a C my_app.dmg