Mac平台CMake/CPack/DragNDrop无法同时配置卷图标与磁盘镜像布局
卷图标与窗口布局冲突:这是预期行为
先给你明确结论:这不是Bug,是CPack当前实现的预期限制。
当你启用CPACK_DMG_DS_STORE_SETUP_SCRIPT时,CPack的流程是这样的:先生成带卷图标的DMG,然后挂载它并运行你的AppleScript来调整窗口布局。但问题出在Finder的行为上——当AppleScript修改Finder窗口的属性(比如大小、图标位置)时,它会触发Finder重新刷新卷的元数据,这会覆盖之前CPack设置的卷图标,导致图标短暂显示后消失。如果禁用脚本,CPack不会触发这个刷新,所以卷图标能正常保留,但布局就没法自定义了。
解决方法:在AppleScript里手动设置卷图标
要同时搞定布局和卷图标,你不能只靠CPACK_PACKAGE_ICON,得把设置卷图标的逻辑加到你的adjust_dmg.scpt脚本里。这样脚本运行时会重新把图标设置回去,覆盖Finder刷新后的状态。
举个例子,在你的脚本末尾加上这段代码:
-- 手动设置卷图标 tell application "Finder" set icon of disk "My CPack App" to POSIX file "/Volumes/My CPack App/.VolumeIcon.icns" end tell
这里的.VolumeIcon.icns是CPack通过CPACK_PACKAGE_ICON自动复制到DMG根目录的文件,所以路径是对的。
如果想一步到位,你可以把所有布局设置和图标设置都写到脚本里,比如这样的完整脚本:
tell application "Finder" set targetDisk to disk "My CPack App" open targetDisk set mainWindow to container window of targetDisk -- 调整窗口大小和位置 set bounds of mainWindow to {100, 100, 800, 600} -- 设置背景图 set background picture of mainWindow to POSIX file "/Volumes/My CPack App/DMGBackground.png" -- 配置图标视图 set current view of mainWindow to icon view set icon size of icon view options of mainWindow to 128 set arrangement of icon view options of mainWindow to not arranged -- 定位应用和Applications链接 set position of item "My-CPack-App.app" of mainWindow to {150, 200} set position of item "Applications" of mainWindow to {550, 200} -- 设置卷图标 set icon of targetDisk to POSIX file "/Volumes/My CPack App/.VolumeIcon.icns" -- 关闭窗口并保存状态 close mainWindow saving yes end tell
关于CPACK_DMG_DS_STORE无效的问题
直接用CPACK_DMG_DS_STORE指定预生成的DS_Store文件时出现图标尺寸错误、无背景图,大概率是因为DS_Store的版本兼容性问题——不同macOS版本生成的DS_Store格式有差异,CPACK直接复用可能会解析失败。
更可靠的做法是:
- 手动创建一个空白DMG,挂载后设置好你想要的窗口大小、背景图、图标位置和尺寸。
- 导出这个DMG里的
.DS_Store文件:在终端运行cp /Volumes/[你的卷名]/.DS_Store ./custom_layout.dsstore。 - 把这个
custom_layout.dsstore放到你的项目里,设置CPACK_DMG_DS_STORE "custom_layout.dsstore"。
不过说实话,这种方法还是不如用AppleScript稳定——因为CPack有时候会对导入的DS_Store做一些隐性修改,导致效果不符合预期。所以更推荐前面说的全脚本控制的方式,所有布局和图标设置都通过AppleScript完成,避免依赖DS_Store的兼容性。
内容的提问来源于stack exchange,提问作者Macintron

