У нас в Neo есть несколько внутренних приложений, которые можно запустить с помощью java -jar, и я всегда забываю, где находятся файлы jar, поэтому я решил обернуть вокруг него пакет приложений Mac OS X, чтобы облегчить жизнь.
Мой любимый шаблон установки — тот, в котором при двойном щелчке по dmg отображается окно, в которое вы можете перетащить приложение в папку «Приложения», например:
Я не фанат мастеров установки, и процесс установки здесь настолько прост, что мастер кажется излишним.
Я начал изучать структуру пакета приложений, которая хорошо описана в руководстве по программированию Apple Bundle. Затем я пробежался по видео, в котором рассказывается, как связать файл JAR в приложении Mac .
Я подумал, что объединение JAR, вероятно, было решенной проблемой, и взглянул на App Bundler , JAR Bundler и Iceberg, прежде чем остановиться на Install4j, который мы использовали для настольного компьютера Neo4j .
Я начал с создания установщика с использованием Install4j, а затем вручную скопировал созданный им модуль запуска в шаблон пакета приложений, но это было невероятно сложно, и в результате я получил множество неразборчивых сообщений в системном журнале ошибок.
В конце концов я понял, что мне не нужно создавать установщик, и что мне действительно нужен архивный файл мультимедиа Mac OS X с одним пакетом .
После того, как я установил это для install4j, мне просто нужно было выяснить, как создать фоновое изображение, сообщающее пользователю перетащить приложение в папку «Приложения».
К счастью, я наткнулся на этот пост StackOverflow, который предоставил AppleScript для этой цели , и с небольшой доработкой я получил следующий сценарий оболочки, который, похоже, выполняет свою работу:
#!/bin/bash rm target/DBench_macos_1_0_0.tgz /Applications/install4j\ 5/bin/install4jc TestBench.install4j title="DemoBench" backgroundPictureName="graphs.png" applicationName="DemoBench" finalDMGName="DemoBench.dmg" rm -rf target/dmg && mkdir -p target/dmg tar -C target/dmg -xvf target/DBench_macos_1_0_0.tgz cp -r src/packaging/.background target/dmg ln -s /Applications target/dmg cd target rm "${finalDMGName}" umount -f /Volumes/"${title}" hdiutil create -volname ${title} -size 100m -srcfolder dmg/ -ov -format UDRW pack.temp.dmg device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}') sleep 5 echo ' tell application "Finder" tell disk "'${title}'" open set current view of container window to icon view set toolbar visible of container window to false set statusbar visible of container window to false set the bounds of container window to {400, 100, 885, 430} set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 72 set background picture of theViewOptions to file ".background:'${backgroundPictureName}'" set position of item "'${applicationName}'" of container window to {100, 100} set position of item "Applications" of container window to {375, 100} update without registering applications delay 5 eject end tell end tell ' | osascript hdiutil detach ${device} hdiutil convert "pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}" rm -f pack.temp.dmg cd ..
Подводя итог, этот сценарий создает символическую ссылку на «Приложения», помещает фоновое изображение в каталог с именем «.background», устанавливает его в качестве фона окна и позиционирует символическую ссылку и приложение соответствующим образом.
И вуаля:
Ребята из Firefox написали пару постов в блоге, подробно рассказывающих об их опыте написания инсталлятора, который также был довольно интересным.