Как создать красивый DMG для Mac OS X с помощью инструментов командной строки? - PullRequest
205 голосов
/ 19 сентября 2008

Мне нужно создать хороший установщик для приложения Mac. Я хочу, чтобы это был образ диска (DMG) с предопределенным размером, макетом и фоновым изображением.

Мне нужно сделать это программно в сценарии, чтобы интегрировать его в существующую систему сборки (на самом деле это скорее система пакетов, поскольку она создает только установщики. Сборки выполняются отдельно).

У меня уже есть создание DMG с использованием "hdiutil", но я пока не выяснил, как сделать макет пиктограммы и указать фоновое растровое изображение.

Ответы [ 14 ]

2 голосов
/ 09 октября 2011

Мне также нужно использовать подход командной строки для создания упаковки и создания dmg «программно в сценарии». Наилучший ответ, который я нашел на данный момент, - это проект сборки релизов Adium (см. R1). Существует специальный скрипт (AdiumApplescriptRunner), позволяющий избежать взаимодействия с OSX WindowsServer GUI. Подход «osascript applecript.scpt» требует, чтобы вы вошли в систему как строитель и запускали создание dmg из сеанса командной строки vt100.

Система управления пакетами OSX не настолько продвинута по сравнению с другими Unixen, которые могут выполнять эту задачу легко и систематически.

R1: http://hg.adium.im/adium-1.4/file/00d944a3ef16/Release

2 голосов
/ 14 апреля 2010

.DS_Store файлы хранят настройки Windows в Mac. Настройки Windows включают расположение значков, фон окна, размер окна и т. Д. Файл .DS_Store необходим для создания окна для смонтированных изображений, чтобы сохранить расположение файлов и фон окна.

После создания файла .DS_Store вы можете просто скопировать его в созданную программу установки (DMG).

1 голос
/ 17 февраля 2014

Я только что написал новую (дружественную) утилиту командной строки, чтобы сделать это. Он не зависит от Finder / AppleScript или какого-либо (устаревшего) API-интерфейса Alias ​​Manager, и его легко настраивать и использовать.

В любом случае, любой, кто заинтересован, может найти его на PyPi ; документация доступна на сайте Read The Docs .

1 голос
/ 02 января 2014

Эти ответы слишком сложны, и времена изменились. Следующее работает на 10.9 просто отлично, разрешения правильные и выглядит красиво.

Создание DMG только для чтения из каталога

#!/bin/sh
# create_dmg Frobulator Frobulator.dmg path/to/frobulator/dir [ 'Your Code Sign Identity' ]
set -e

VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
CODESIGN_IDENTITY="$4"

hdiutil create -srcfolder "$SRC_DIR" \
  -volname "$VOLNAME" \
  -fs HFS+ -fsargs "-c c=64,a=16,e=16" \
  -format UDZO -imagekey zlib-level=9 "$DMG"

if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

Создание DMG только для чтения со значком (тип .icns)

#!/bin/sh
# create_dmg_with_icon Frobulator Frobulator.dmg path/to/frobulator/dir path/to/someicon.icns [ 'Your Code Sign Identity' ]
set -e
VOLNAME="$1"
DMG="$2"
SRC_DIR="$3"
ICON_FILE="$4"
CODESIGN_IDENTITY="$5"

TMP_DMG="$(mktemp -u -t XXXXXXX)"
trap 'RESULT=$?; rm -f "$TMP_DMG"; exit $RESULT' INT QUIT TERM EXIT
hdiutil create -srcfolder "$SRC_DIR" -volname "$VOLNAME" -fs HFS+ \
               -fsargs "-c c=64,a=16,e=16" -format UDRW "$TMP_DMG"
TMP_DMG="${TMP_DMG}.dmg" # because OSX appends .dmg
DEVICE="$(hdiutil attach -readwrite -noautoopen "$TMP_DMG" | awk 'NR==1{print$1}')"
VOLUME="$(mount | grep "$DEVICE" | sed 's/^[^ ]* on //;s/ ([^)]*)$//')"
# start of DMG changes
cp "$ICON_FILE" "$VOLUME/.VolumeIcon.icns"
SetFile -c icnC "$VOLUME/.VolumeIcon.icns"
SetFile -a C "$VOLUME"
# end of DMG changes
hdiutil detach "$DEVICE"
hdiutil convert "$TMP_DMG" -format UDZO -imagekey zlib-level=9 -o "$DMG"
if [ -n "$CODESIGN_IDENTITY" ]; then
  codesign -s "$CODESIGN_IDENTITY" -v "$DMG"
fi

Если что-то еще должно произойти, проще всего сделать временную копию SRC_DIR и применить к ней изменения перед созданием DMG.

...