У нас в 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 написали пару постов в блоге, подробно рассказывающих об их опыте написания инсталлятора, который также был довольно интересным.