Как сделать PKG файл: подробная инструкция

Чтобы собрать рабочий 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

Выполнено: 0 / 4

Сборка пакета через 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
📊 Для какой задачи вы собираете 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, но большим номером версии. Система распознает его как обновление и корректно заменит файлы.