我正在开发一个多平台项目,该项目由在Windows,Linux和Mac OSX上运行的服务/守护程序组成。
我的代码是可移植的,并且应用程序在所有系统上运行正常(从命令行)。由于此应用程序旨在在后台运行,因此我将其作为Windows上的Windows服务和Linux上的Linux守护程序(在init.d中具有相应的脚本)。
现在我的问题是Mac OSX:我对这个操作系统没什么经验,而且我很难找到关于我的情况的最佳实践:
我想为我的项目安装一个安装程序(我相信一个.dmg文件,可能会安装.app;如果有更好的选择,请纠正我。)
这里有关于我的这个项目的一些信息:
对于单个问题,这可能需要考虑很多背景,所以我会尝试让它更容易阅读:
如何在Mac OSX上打包/创建纯C ++守护程序的安装程序?
答案 0 :(得分:3)
如果您要分发的内容不仅仅是命令行(例如,如果它具有静态配置数据,图像,框架/ dylib等资源)需要随附它)。
无论分发到底是什么,您都可以使用/ usr / bin中已有的工具pkgbuild
和productbuild
来创建安装程序。 Making OS X Installer Packages like a Pro - Xcode Developer ID ready pkg可以帮助您开始使用这些工具。
答案 1 :(得分:3)
由于没有UI,我不会将其打包为.app - 这是双击GUI应用程序的首选格式,而不是守护进程。如果它只是一个二进制文件(除了配置文件之类的东西之外没有支持文件等),我会遵循unix约定并将二进制文件放在某个地方,比如/ usr / local / libexec(或者你把它放在Linux上的任何地方)。请注意,OS X上默认不存在/ usr / local,因此如果安装程序不存在,安装程序将需要创建它。
让它执行:我同意詹姆斯贝德福德关于使用launchd的建议。 launchd .plist文件应安装在/ Library / LaunchDaemons中(LaunchDaemons在启动时以root身份运行,而LaunchAgent在用户登录时以普通用户身份运行)。确保守护进程不会掉进后台 - launchd会监视它启动的程序,如果它们自己背景,它会认为它们已经崩溃了,并且通常会尝试重新启动它们,这样做效果不好。您可以调整设置以使用后台程序,但最好让它在前台运行。
包装:在这里,我同意mah - 使用安装包。我实际上仍然喜欢旧的GUI PackageMaker工具(不推荐使用,但它仍然有效),但是新的CLI工具可能更好地学习。如果您遵循我关于/ usr / local / libexec的建议,您的包实际上应该包含“本地”目录(包含libexec subdir和您的二进制文件),并将其安装到/ usr中 - 如果/ usr / local已经存在,它只会与已经存在的东西合并,但如果没有,它将创造整个东西。另一方面,/ Library / LaunchDaemons保证存在,因此您的包只需要包含要放入其中的实际.plist文件。
答案 2 :(得分:2)
您是否查看了Apple提供的Daemons and Services Programming Guide?我认为这对平台的介绍会非常有用,并且应该指向正确的方向(如果没有告诉你如何做到你想要的那样)。
您还应该查看launchd(在该编程指南中讨论)。 launchd是OSX的官方deamon启动器/管理器,并且与操作系统高度集成。应该很容易将现有的跨平台守护进程包装到已启动的守护进程中,并且可以与OS X集成,以便守护进程自动启动。