OSX.pkg installer иногда не устанавливает файл .app

В моем приложении Java есть средство запуска, которое является .app и вспомогательным приложением, которое связано с ним.

Я пытаюсь сделать установщик .pkg с фоновым изображением, используя следующие команды:

pkgbuild --root "./Temp"  --identifier "com.company.id" --install-location "/Applications" --sign "signature" "temp.pkg"
productbuild  --package-path "temp.pkg" --distribution "./Distribution.xml" --package-path "./Temp" --resources "./Resources" --sign "installer signature"  "$FINAL_PKG"

Когда я смотрю в каталог в. /Temp, оба папки .app есть и когда я деконструирую .pkg с помощью:

pkgutil --expand "temp.pkg" "temp"

Я вижу папки .app, но иногда одна из папок .app не отображается, когда она установлена ​​из pkg. Кажется, что они появляются в первый раз, когда они установлены, но на машинах, где приложение установлено и удалено много раз (например, на тестовых и машинах разработки), одна из папок .app в конечном итоге не появится. Мне интересно, что здесь можно сделать?

Первоначально у нас было вспомогательное приложение внутри отдельного каталога в качестве основного приложения, и в этом случае вспомогательное приложение иногда не устанавливалось, но основное приложение всегда было бы. Затем мы попытались разместить вспомогательное приложение внутри основного приложения, а затем это сработало в первый раз, но в следующий раз, когда я попытался установить его из установщика, главного приложения там не было!

Ответ 1

У меня была примерно такая же проблема. Похоже, что установщик OS X использует информацию о уже установленных пакетах и ​​пакетах приложений, чтобы решить, где и когда устанавливать новые пакеты. В результате иногда мой установщик не устанавливал никаких файлов вообще, а иногда просто перезаписывал пакет .app в моем дереве сборки. Не обязательно тот, который использовался для сборки установщика, но любой пакет .app, найденный OS X. Чтобы программа установки правильно установила файлы, мне пришлось сделать две вещи:

  • Сообщите OS X, чтобы он забыл об установленном пакете

    sudo pkgutil --forget <package id> Не уверен, что это необходимо для вас и в моем случае, но это, вероятно, хорошая идея.

  • Удалите все существующие пакеты .app для приложения. Если я этого не сделал, существующий пакет приложений был перезаписан при установке вместо приложения, помещенного в/Приложения. Возможно, есть способ предотвратить это при создании пакета установщика, но я его не нашел.

Если вы, возможно, должны попытаться сделать свое приложение самостоятельно, чтобы пользователи могли его установить, просто перетащив его в /Applications. Конечно, это работает только в том случае, если вам не нужно устанавливать что-либо за пределами вашего пакета .app.

Ответ 2

Если вы не хотите (или не можете ожидать от других пользователей) выслеживать и удалять все существующие копии приложения, как описано villintehaspam, или просто действительно нужно, чтобы приложение не было перемещено, вы можете предоставить Файл списка свойств компонента с BundleIsRelocatable установлен в значение false.

Простым способом создания допустимой версии файла plist является pkgbuild --analyze; то вы можете отредактировать одно свойство и использовать файл. Например:.

pkgbuild --root myapp.root --analyze myapp.plist
/usr/libexec/PlistBuddy -c 'set :Dict:BundleIsRelocatable false' myapp.plist
pkgbuild --root myapp.root --component-plist myapp.plist [...other options...] myapp.pkg