Чтобы собрать рабочий PKG-файл для macOS, достаточно встроенных утилит pkgbuild и productbuild — они входят в состав инструментов командной строки Xcode и не требуют установки сторонних программ. Ошибка чаще всего возникает не на этапе сборки, а из-за неправильной структуры исходной папки: установщик пакует файлы «как есть», и если корневая директория организована неверно, приложение окажется не в том месте после установки.
Ниже разберём, что представляет собой формат PKG, как подготовить файлы, собрать пакет через Терминал, подписать его и проверить результат. Инструкция ориентирована на macOS, поскольку именно там используется этот формат установщиков.
Что такое PKG-файл и когда он нужен
PKG — это формат установочного пакета операционной системы macOS. Внутри находится архив с файлами программы и сценарий установки, который системный Installer выполняет при двойном клике. Формат поддерживает скрипты до и после установки, проверку версии системы и цифровую подпись разработчика.
Пакет нужен, когда простого копирования приложения недостаточно: например, файлы должны попасть в системные каталоги, требуется запустить фоновую службу или выполнить настройку при установке. Для обычной программы, которая целиком живёт в одном .app-бандле, чаще используют DMG-образ.
- 📦 Распространение приложений вне Mac App Store с корректной установкой в системные папки.
- ⚙️ Установка драйверов, плагинов и фоновых служб, требующих скриптов настройки.
- 🏢 Корпоративное развёртывание ПО на множестве Mac через системы управления устройствами.
- 🔐 Передача подписанного установщика, который не блокирует Gatekeeper.
Подготовка структуры файлов
Ключевой принцип: папка, которую вы передаёте упаковщику, воспроизводит структуру диска от корня. Если приложение должно оказаться в /Applications, внутри рабочей папки создайте подпапку Applications и положите туда свой .app. Если нужен файл в /Library/Scripts — создайте соответствующую цепочку каталогов.
Создайте отдельную папку проекта, например MyPackage, и соберите в ней нужную иерархию. Проверьте права доступа к файлам заранее: исполняемые скрипты должны иметь флаг запуска, иначе установщик не сможет их выполнить. Команда chmod +x имя_скрипта решает эту задачу.
⚠️ Внимание: не помещайте в пакет символические ссылки на внешние файлы — после установки на другом Mac они окажутся битыми. Копируйте сами файлы в структуру пакета.
☑️ Подготовка к сборке PKG
Сборка пакета через pkgbuild
Утилита pkgbuild создаёт так называемый компонентный пакет из подготовленной папки. Откройте Терминал и выполните команду, подставив свои пути и идентификатор:
pkgbuild --root ./MyPackage --identifier com.example.myapp --version 1.0 --install-location / MyApp.pkg
Разберём параметры. --root указывает папку с файлами, --identifier задаёт уникальный идентификатор пакета в формате обратного домена, --version — номер версии, а --install-location / означает установку от корня диска с сохранением структуры. Результатом будет файл MyApp.pkg в текущей директории.
Если нужны скрипты до или после установки, создайте папку scripts с файлами preinstall и/или postinstall (без расширения, с правами на исполнение) и добавьте параметр --scripts ./scripts к команде.
Создание дистрибутивного пакета через productbuild
Компонентный пакет работает, но для распространения обычно собирают продуктовый пакет — с экраном приветствия, лицензией и выбором компонентов. Для этого служит утилита productbuild.
Простейший вариант — обернуть уже созданный компонентный пакет:
productbuild --package MyApp.pkg MyAppInstaller.pkg
Для полноценного установщика с несколькими компонентами и текстом лицензии потребуется файл Distribution в формате XML, где описываются экраны мастера установки. Его можно сгенерировать командой productbuild --synthesize --package MyApp.pkg Distribution.xml и затем отредактировать под свои задачи.
| Утилита | Назначение | Результат |
|---|---|---|
| pkgbuild | Упаковка файлов и скриптов | Компонентный .pkg |
| productbuild | Сборка установщика с мастером | Дистрибутивный .pkg |
| pkgutil | Проверка и распаковка пакетов | Диагностика содержимого |
| productsign | Подпись готового установщика | Подписанный .pkg |
Подпись пакета и Gatekeeper
Неподписанный установщик будет заблокирован Gatekeeper при запуске из интернета — пользователь увидит предупреждение о неизвестном разработчике. Чтобы этого избежать, пакет подписывают сертификатом Developer ID Installer, который выдаётся в рамках платной программы Apple Developer Program.
Подпись выполняется при сборке параметром --sign "Developer ID Installer: Имя" в productbuild либо отдельно через productsign. Дополнительно Apple требует нотаризацию — отправку пакета на автоматическую проверку через xcrun notarytool. Точные требования к нотаризации периодически меняются, поэтому сверяйтесь с актуальной документацией Apple для разработчиков.
⚠️ Внимание: если пакет предназначен только для внутреннего использования в вашей организации, подпись Developer ID не обязательна — установку можно разрешить через системы управления устройствами (MDM) или локально в настройках безопасности.
Что такое нотаризация и зачем она нужна
Нотаризация — это автоматическая проверка пакета серверами Apple на наличие вредоносного кода. После успешной проверки к файлу прикрепляется «билет» (staple), и Gatekeeper пропускает установщик без предупреждений. Проверка занимает от нескольких минут до получаса.
Проверка готового установщика
Перед распространением протестируйте пакет на чистой системе или виртуальной машине. Убедитесь, что файлы попадают в нужные каталоги, скрипты отрабатывают, а приложение запускается после установки.
Посмотреть содержимое пакета без установки поможет команда:
pkgutil --expand-full MyApp.pkg ./extracted
Также полезно проверить подпись командой pkgutil --check-signature MyApp.pkg — она покажет, чьим сертификатом подписан пакет и действительна ли подпись. Если установка завершается ошибкой, журнал с подробностями доступен в приложении «Консоль» или по команде tail -f /var/log/install.log во время установки.
Типичные ошибки при создании PKG
Чаще всего проблемы связаны не с самими утилитами, а с подготовкой. Неверный --install-location приводит к тому, что файлы распаковываются не туда; отсутствие прав на исполнение ломает postinstall-скрипты; кириллица или пробелы в идентификаторе пакета могут вызвать отказ сборки.
- 🚫 Установка проходит, но приложения нет в /Applications — проверьте структуру исходной папки и параметр
--install-location. - 🚫 Ошибка скрипта при установке — убедитесь, что у
preinstall/postinstallнет расширения и выставлен флаг исполнения. - 🚫 Gatekeeper блокирует установщик — пакет не подписан или подпись недействительна.
- 🚫 Пакет «устанавливается» мгновенно и пуст — в
--rootпередана пустая или неверная папка.
Часто задаваемые вопросы
Можно ли создать PKG-файл на Windows?
Нет, штатные утилиты pkgbuild и productbuild существуют только в macOS. На Windows теоретически возможна сборка в виртуальной машине с macOS, но это нарушает лицензионное соглашение Apple на не-Apple оборудовании.
Чем открыть или распаковать готовый PKG?
На macOS — командой pkgutil --expand-full файл.pkg папка. Также содержимое можно просмотреть сторонними архиваторами, поддерживающими формат xar.
Нужен ли платный аккаунт разработчика Apple?
Для сборки и локального тестирования — нет. Платная программа Apple Developer Program нужна только для сертификата Developer ID и нотаризации, то есть для публичного распространения без предупреждений Gatekeeper.
Чем PKG отличается от DMG?
DMG — это образ диска, из которого пользователь вручную перетаскивает приложение. PKG — полноценный установщик с мастером, скриптами и возможностью размещать файлы в системных каталогах.
Как обновить уже установленное приложение новым PKG?
Соберите пакет с тем же --identifier, но большим номером версии. Система распознает его как обновление и корректно заменит файлы.