ere*_*eOn 5 c++ macos installation xcode package-managers
我正在开发一个多平台项目,该项目由在 Windows、Linux 和 Mac OSX 上运行的服务/守护程序组成。
我拥有的代码是可移植的,并且应用程序在所有系统上运行良好(从命令行)。由于此应用程序设计为在后台运行,因此我将其设为 Windows 上的 Windows 服务和 Linux 的 Linux 守护程序(在 init.d 中具有适当的脚本)。
现在我的问题是 Mac OSX:我对这个操作系统的经验很少,而且我很难根据我的情况找出最佳实践:
我想为我的项目安装一个安装程序(我相信一个 .dmg 文件,它可能会安装一个 .app;如果有更好的选择,请纠正我)。
这里有一些关于我的这个项目的信息:
对于单个问题,这可能需要考虑很多上下文,因此我将尝试使其更易于阅读:
您将如何为 Mac OSX 上的纯 C++ 守护程序打包/创建安装程序?
由于它没有 UI,我不会将其打包为 .app——这是可双击 GUI 应用程序的首选格式,而不是守护程序的首选格式。如果它只是一个二进制文件(没有支持文件,除了配置文件等),我会遵循unix约定并将二进制文件放在像/usr/local/libexec这样的地方(或者你把它放在Linux上的任何地方)。请注意,默认情况下,OS X 上不存在 /usr/local,因此如果它不存在,安装程序将需要创建它。
为了让它执行:我同意 James Bedford 使用 launchd 的建议。launchd .plist 文件应安装在 /Library/LaunchDaemons 中(LaunchDaemons 在启动时以 root 身份运行,而 LaunchAgents 在用户登录时以普通用户身份运行)。确保守护进程不会将自己置于后台 - launchd 会监视它启动的程序,如果它们自己进入后台,它会认为它们已经崩溃,并且通常会尝试重新启动它们,但这效果不佳。您可以调整设置以与后台程序一起使用,但最好让它在前台运行。
对于打包:在这里,我同意mah——使用安装程序包。实际上,我仍然喜欢旧的 GUI PackageMaker 工具(已弃用,但它仍然有效),但此时学习新的 CLI 工具可能更好。如果您遵循我关于 /usr/local/libexec 的建议,您的包实际上应该包含“本地”目录(其中包含 libexec 子目录和您的二进制文件),并将其安装到 /usr 中 - 如果 /usr/local 已经存在,它只会与已有的东西合并,但如果没有,它会创建整个东西。另一方面,/Library/LaunchDaemons 保证存在,因此您的包只需要包含实际的 .plist 文件即可放入其中。