Я работаю над мультиплатформенным проектом, который состоит из сервиса / демона, который работает в Windows, Linux и Mac OSX.
У меня есть переносимый код, и приложение работает нормально (из командной строки) на всех системах. Поскольку это приложение предназначено для работы в фоновом режиме, я сделал его службой Windows в Windows и демоном Linux (с соответствующими сценариями в init.d) для Linux.
Теперь моя проблема — Mac OSX: у меня мало опыта работы с этой операционной системой, и я испытываю трудности с поиском лучших практик для этой ситуации:
Я хотел бы иметь установщик для моего проекта (я полагаю, что файл .dmg, который, вероятно, установит .app; пожалуйста, исправьте меня, если есть лучшая альтернатива).
Вот некоторая информация об этом моем проекте:
Это, вероятно, много контекста для рассмотрения одного вопроса, поэтому я постараюсь сделать его проще для чтения:
Как бы вы упаковали / создали программу установки для демона чистого C ++ в Mac OSX?
Так как у него нет пользовательского интерфейса, я бы не упаковал его как .app — это предпочтительный формат для приложений с графическим интерфейсом с двойным щелчком, а не для демонов. Если это всего лишь один двоичный файл (без вспомогательных файлов, за исключением, возможно, таких как файлы конфигурации и т. Д.), Я бы следовал соглашениям Unix и поместил бы двоичный файл куда-нибудь, например, / usr / local / libexec (или куда бы вы ни поместили его в Linux). Обратите внимание, что / usr / local не существует по умолчанию в OS X, поэтому ваш установщик должен будет создать его, если он не существует.
Чтобы заставить его исполниться: я соглашаюсь с предложением Джеймса Бедфорда об использовании launchd. Файл launchd .plist должен быть установлен в / Library / LaunchDaemons (LaunchDaemons запускается как root при запуске, тогда как LaunchAgents запускается как обычный пользователь, когда этот пользователь входит в систему). Убедитесь, что демон не уходит в фоновый режим — launchd следит за программами, которые он запускает, и, если они сами работают в фоновом режиме, он думает, что у них произошел сбой, и, как правило, пытается перезапустить их, что не очень хорошо работает. Вы можете настроить параметры для работы с фоновыми программами, но лучше всего запускать их на переднем плане.
Для упаковки: здесь я согласен с mah — используйте установочный пакет. Мне на самом деле все еще нравится старый GUI PackageMaker (устарел, но он все еще работает), но новые инструменты CLI, вероятно, лучше изучить на этом этапе. Если вы следуете моей рекомендации относительно / usr / local / libexec, ваш пакет должен фактически содержать «локальный» каталог (с subdir libexec и вашим двоичным файлом в нем), и установить его в / usr — если / usr / local уже существует, это просто слится с тем, что уже есть, но если нет, то создаст все это. С другой стороны, / Library / LaunchDaemons гарантированно существует, поэтому ваш пакет должен содержать только фактический файл .plist для его добавления.
Упаковка как .app имеет некоторый смысл, если вы распространяете нечто большее, чем просто командная строка (например, если у него есть ресурсы, такие как статические данные конфигурации, изображения, frameworks / dylibs), которые должны прийти вместе с ним).
Независимо от того, что именно распространяется, вы можете создать установщик, используя инструменты, которые у вас уже есть — pkgbuild
а также productbuild
, оба в / usr / bin. Создание пакетов установщика OS X, таких как Pro — Xcode Developer ID, готовый pkg вы можете начать использовать эти инструменты.
Вы проверили Руководство по программированию демонов и сервисов предоставлено Apple? Я думаю, что это было бы очень полезно в качестве введения в платформу и должно указывать вам правильное направление (если не показать вам, как делать именно то, что вы хотите).
Вы также должны проверить launchd (который обсуждается в этом руководстве по программированию). launchd является официальным deamon launcher / manager для OSX и тесно интегрирован с операционной системой. Должно быть достаточно легко превратить ваш существующий кроссплатформенный демон в запущенный демон, и вы можете интегрироваться с OS X, чтобы демон запускался автоматически.