如何在非Mac平台上构建dmg Mac OS X文件?

63

是否有可能在非Mac平台上构建.dmg文件(用于分发应用程序)?如果可以,如何实现?


1
你最终是如何实现DMG文件的创建的?你能够生成压缩的DMG文件吗?我在这里提出了一个类似于你的问题:https://dev59.com/-VXTa4cB1Zd3GeqP6vke - Pierre Arnaud
我只使用Mac;最有趣的答案是mkfs,但我不使用Linux进行构建。 - michelemarcon
谢谢,你能自动化整个过程吗? - Pierre Arnaud
https://askubuntu.com/questions/1117461/how-do-i-create-a-dmg-file-on-linux-ubuntu-for-macos - Channa
7个回答

39

没错,mkfs.hfsplus 可以做到。

dd if=/dev/zero of=/tmp/foo.dmg bs=1M count=64
mkfs.hfsplus -v ThisIsFoo /tmp/foo.dmg

这将创建一个DMG文件(在此示例中为64M),可在Mac上挂载。它也可以在Linux上挂载,方法类似于:

mount -o loop /tmp/foo.dmg /mnt/foo

接下来你只需要将想要复制的内容复制到该位置(在/mnt/foo中)。卸载它,然后可以将dmg文件复制到Mac上并挂载。


据我所知,用这种方式创建的 dmg 文件在 Finder 中会显示为“锁定”。有没有办法改变这个情况? - uckelman
如果您的发行版没有安装,需要安装以下软件包:kmod-hfsplus(来自elrepo)和hfsplus-tools - Soren
1
这在本地运行是有效的。但我正在尝试在gitlab-ci中构建dmg文件。我在程序包阶段使用了一个alpine docker镜像。结果发现你根本不能在docker中使用挂载(除非你通过向容器添加特权来解决),所以我仍在寻找一种方法将.app目录复制到其中而无需挂载该文件。 - Max
1
genisoimage -D -V "$(PROJECT) $(VERSION)" -no-pad -r -apple -o project-$(VERSION)-uncompressed.dmg $(DARWIN_DIR)这似乎是有效的。但我仍然需要验证生成的 .dmg 文件是否可用。现在没有我的 Mac。 - Max
是的,它确实起作用了。但事实证明,为gitlab-ci创建一个特权容器也不是一个坏的解决方案。如果您有一个专用的runner(就像gitlab建议您做的那样),您就不能真正搞砸太多东西。这也是gitlab建议在ci中构建docker镜像的方式。使用特权的docker runner,它只是意味着它可以做一些通常无法做到的事情。例如,在docker镜像中挂载镜像和构建docker。 - Max
显示剩余2条评论

35

我参与的一个项目在Linux上使用genisoimage创建DMG文件:

mkdir -p dmgdir/progname.app/Contents/{MacOS,Resources}
...copy your PkgInfo, Info.plist to Contents...
...copy your .icns to Resources...
...copy your other things to where you expect them to go...
genisoimage -V progname -D -R -apple -no-pad -o progname.dmg dmgdir 

如果你想要更加高级一些,你可以从一个名为progname的卷和一个叫做progname.app的应用包制作的DMG中窃取.DS_Store文件(即与你想在Mac上创建的内容相匹配),在其中放置一个背景图像.background/background.png和一个到根目录下的/Applications的符号链接,并将其与自己的指向/Applications的符号链接一起放入dmgdir

最后,如果您想要创建压缩的DMG,请从libdmg-hfsplus获取dmg工具:

dmg uncompressed.dmg compressed.dmg

谢谢,救了我的一天! - Yaronius
你提到了一个工具,它可以从目录中创建dmg文件。你有这个工具的链接吗?(不是用于从普通dmg文件创建压缩dmg文件的链接)。 - AlienDrew
@AlienDrew genisoimage在大多数Linux发行版中都可用。请检查您的软件包管理器。 - uckelman
@uckelman,没有直接将文件夹转换为dmg的方法吗?我必须先创建一个映像,然后再进行转换吗? - AlienDrew
DMG支持的文件系统之一是ISO-9660,因此您可以将ISO-9660映像视为未压缩的DMG。在上面的示例中,genisomage生成的文件是有效的DMG,因此该示例直接将文件夹转换为DMG,但我怀疑这并没有回答您的问题。 - uckelman
@uckelman,我只是误解了。我明白你的意思了,现在我能够创建自己的 dmg 文件了,谢谢! - AlienDrew

10
git clone https://github.com/hamstergene/libdmg-hfsplus
cd libdmg-hfsplus && cmake . && make && cd dmg
./dmg --help

Makefile:

dmg:
    genisoimage -D -V "$(PROJECT) $(VERSION)" -no-pad -r -apple -o project-$(VERSION)-uncompressed.dmg $(DARWIN_DIR)
    ./dmg dmg project-$(VERSION)-uncompressed.dmg project-$(VERSION).dmg

未压缩版本直接使用,压缩可能会导致问题 - 至少在snow-leopard上,原始/主要版本会产生“校验和”错误


如何使用“dmg”从iso文件创建dmg文件?帮助文档并不是很有用。 - Gergely

8

似乎有一些第三方工具可以创建DMG文件。 一个快速的谷歌搜索就能找到至少几个商业工具:

不确定是否有任何开源/免费选项,但如果你愿意的话,至少看起来是可能的。

编辑:我还忘记了MacDrive,这是另一个在windows下使用HFS+文件系统的好工具。由于DMG基本上只是HFS+文件系统的快照,所以使用MacDrive也可能创建DMG。


你还应该能够在Linux下使用命令行工具完成这个任务,就像在Mac OS X上通过命令行创建DMG一样。 - saschabeaumont

4
我不确定是否还有人关注这个帖子,但我尝试了Nik Reiman推荐的TransMac。
使用这个工具,我能够在Windows 7上创建dmg文件,并在OSX 10.8.3上挂载。
缺点是,这个工具似乎不支持命令行操作。对我们来说,这是一个致命问题,因为我们需要一个自动化工具,让我们的构建服务器(基于Windows)能够即时构建dmg文件。

1
将来,您可以在原始答案下的评论中留下这样的信息,而不是创建新答案。您仍然可以获得赞同票。 - Zenexer
我只是好奇,我的回答有什么不足以使它成为一个答案?并不是要无礼,只是好奇。虽然我并不在意赞同票。 - MattWeiler
2
这更像是对另一个答案的回应。正如您在您的回答中所指出的,其他人已经发布了此过程。如果您对答案有反馈(例如您对解决方案的体验),评论是添加该信息的好地方。如果您想要显着更改该过程,则应发布新答案。 - Zenexer
苹果公司在理解跨编译和平台可移植性对于CI/CD的需求方面非常糟糕,这真是令人惊讶。甲骨文也一样;没有好的方法可以在同一主机上为多个目标构建可安装的Java应用程序,而不需要庞大混乱的脚本。 - nyet

2
请参阅mkfs.hfsplus。

-37

如果您要分发 Mac 应用程序,那么肯定有一台 Mac 用于编写和测试应用程序。为什么不直接使用同一台 Mac 来创建磁盘映像呢?

[编辑] 或者,如果您要分发便携式应用程序,例如 Java .jar 文件,为什么要费力地创建磁盘映像?Mac 理解 .zip 和 .tar.gz 归档文件很好。

我想我要表达的是,我不理解为什么一个人需要 DMG 磁盘映像,但没有用于创建它的 Mac。


26
他没有说他没有Mac电脑。我可以想象一种构建环境,在这个环境中,所有其他平台都在一个系统上准备好了(例如使用交叉编译器),他也想在那里构建Mac版本的发行包。 - Rob Kennedy
18
实际上,有几个人在Linux上构建Windows安装程序,我相信同样的工具也可以在Mac上使用。这就是交叉编译的魔力:一台机器可以为所有目标构建。 - CesarB
16
我认为“只使用Mac”不是一个好答案,所以我给了-1分。我没有Mac,也不想要。如果出现Mac问题,我的用户会提供测试反馈,但通常情况下我不需要专门在该平台上进行测试(我正在构建和分发Java应用程序)。此外,必须在单独的机器上构建和部署发布版本很麻烦。Zip归档文件可行(Maven可以创建它们),但DMG更好,因为它可以更好地熟悉Mac用户使用的常见安装程序。 - Laurens Holst
11
如果你要发布 Mac 应用程序,那么肯定你有一台 Mac 来编写和测试它们。然而,这并不是真的。作为一名 Python 开发者,我可以编写适用于 Win/Mac/Linux 的程序,而且完全不需要使用我的 Mac!(我只有一台过时的 PPC G4 机器,无法编译 Python/PyGTK 文件。)另外,我们软件开发人员需要为其他人构建软件,进而需要创建 .dmg 文件。 - CodeMouse92
5
如果他正在使用构建服务器来构建软件,以进行持续集成或自动化部署,那么很可能他没有访问生产版本软件的 Mac。 - RodeoClown
显示剩余2条评论

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