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