Как создать красивый DMG для Mac OS X с помощью инструментов командной строки?
Мне нужно создать хороший установщик для Mac приложения. Я хочу, чтобы это был образ диска (DMG) с предопределенным размером, макетом и фоновым изображением.
Мне нужно сделать это программно в скрипте, чтобы быть интегрированным в существующую систему сборки (больше пакетной системы на самом деле, так как она только создает установщики. Сборки выполняются отдельно).
У меня уже есть создание DMG с помощью "hdiutil", что я еще не узнал, как сделать макет значка и укажите растровое изображение фона.
14 ответов:
после долгих исследований я придумал этот ответ, и поэтому я помещаю его здесь в качестве ответа на свой собственный вопрос, Для справки:
убедитесь, что в разделе Системные настройки>>Универсальный доступ установлен флажок" Разрешить доступ для вспомогательных устройств". Это необходимо для работы AppleScript. Возможно, вам придется перезагрузиться после этого изменения (в противном случае он не работает на Mac OS X Server 10.4).
создать R / W DMG. Он должен быть больше результат будет. В этом примере переменная bash "size" содержит размер в КБ, а содержимое папки в переменной bash "source" будет скопировано в DMG:
hdiutil create -srcfolder "${source}" -volname "${title}" -fs HFS+ \ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${size}k pack.temp.dmgсмонтируйте образ диска и сохраните имя устройства (возможно, вы захотите использовать sleep в течение нескольких секунд после этой операции):
device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \ egrep '^/dev/' | sed 1q | awk '{print }')сохраните фоновое изображение (в формате PNG) в папке под названием ".фон " в DMG, и сохранить его имя в переменная" backgroundPictureName".
используйте AppleScript для установки визуальных стилей (имя .приложение должно быть в переменной bash "applicationName" , используйте переменные для других свойств по мере необходимости):
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}'" make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} 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 close end tell end tell ' | osascriptзавершите DMG, правильно установив разрешения, сжимая и отпуская его:
chmod -Rf go-w /Volumes/"${title}" sync sync hdiutil detach ${device} hdiutil convert "/pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}" rm -f /pack.temp.dmgна Snow Leopard приведенный выше applescript не будет правильно устанавливать положение значка - похоже, это снег Леопардовый Жук. Одним из обходных путей является простой вызов close / open после установки значков, т. е.:
.. set position of item "'${applicationName}'" of container window to {100, 100} set position of item "Applications" of container window to {375, 100} close open
есть маленький скрипт Bash под названием create-dmg это создает причудливые DMGs с пользовательскими фонами, пользовательским позиционированием значков и именем Тома.
Я построил его много лет назад для компании, которой я управлял в то время; он выживает на вклад других людей с тех пор и, как сообщается, работает хорошо.
там же узел-appdmg который выглядит как более современное и активное усилие, основанное на узле.в JS; проверить его, как хорошо.
Не ходи туда. Как долгосрочный разработчик Mac, я могу заверить вас, что ни одно решение не работает хорошо. Я пробовал так много решений, но все они не слишком хороши. Я думаю, проблема в том, что Apple на самом деле не документирует формат метаданных для необходимых данных.
вот как я это делаю уже давно, очень успешно:
создать новый DMG, записываемый(!), достаточно большой, чтобы содержать ожидаемые двоичные и дополнительные файлы, такие как readme (разреженный может работа.)
установите DMG и дайте ему макет вручную в Finder или с любыми инструментами, которые вам подходят для этого (см. ссылку FileStorm внизу для хорошего инструмента). Фоновое изображение-это обычно изображение, которое мы помещаем в скрытую папку (".что-то") на DMG. Поставьте туда копию своего приложения (подойдет любая версия, даже устаревшая). Копирование других файлов (псевдонимы, readme и др.)) вы хотите там, опять же, устаревшие версии будут делать просто отлично. Убедитесь, что значки имеют правильные размеры и позиции (IOW, макет DMG так, как вы хотите, чтобы это было).
снова отключите DMG,все настройки должны быть сохранены.
напишите сценарий создания DMG, который работает следующим образом:
- он копирует DMG, поэтому оригинал никогда не трогается снова.
- он монтирует копию.
- он заменяет все файлы с наиболее актуальными из них (например, последнее приложение после сборки). Вы можете просто использовать mv или то же самое для этого в командной строке. Обратите внимание, что при замене такого файла значок останется прежним, позиция останется прежней, все, кроме содержимого файла (или каталога), останется прежним (по крайней мере, с ditto, который мы обычно используем для этой задачи). Вы можете, конечно, также заменить фоновое изображение на другое (просто убедитесь, что оно имеет те же размеры).
- после замены файлов, сделайте сценарий размонтировать копию DMG снова.
- наконец вызовите hdiutil, чтобы преобразовать записываемый, в сжатый (и такой не записываемый) DMG.
этот метод может показаться не оптимальным, но поверьте, это работает очень хорошо на практике. Вы можете поместить исходный DMG (шаблон DMG) даже под контроль версий (например, SVN), поэтому, если вы когда-нибудь случайно измените/уничтожите его, вы можете просто вернуться к ревизии, где все было в порядке. Вы можете добавить шаблон DMG в свой проект Xcode вместе с все остальные файлы, которые принадлежат к DMG (readme, URL-файл, фоновое изображение), все под управлением версии, а затем создать цель (например, внешняя цель с именем "создать DMG") и там запустить сценарий DMG выше и добавить свой старый основной целевой объект в качестве зависимой цели. Вы можете получить доступ к файлам в дереве Xcode, используя ${SRCROOT} в скрипте (всегда является исходным корнем вашего продукта), и вы можете получить доступ к продуктам сборки с помощью ${BUILT_PRODUCTS_DIR} (всегда является каталогом, где Xcode создает сборку результаты.)
результат: на самом деле Xcode может производить DMG в конце сборки. DMG, который готов к выпуску. Мало того, что вы можете создать relase DMG довольно легко, вы можете сделать это в автоматическом процессе (на обезглавленном сервере, если хотите), используя xcodebuild из командной строки (например, автоматические ночные сборки).
Что касается начальной компоновки шаблона, FileStorm хороший инструмент для этого. Это коммерческий, но очень мощный и простой в использовании. Обычная версия составляет менее $ 20, поэтому она действительно доступна. Возможно, можно автоматизировать FileStorm для создания DMG (например, через AppleScript), никогда не пробовал этого, но как только вы нашли идеальный шаблон DMG, его очень легко обновить для каждого выпуска.
доведение этого вопроса до настоящего времени, предоставив этот ответ.
appdmgЭто простая, простая в использовании программа командной строки с открытым исходным кодом, которая создает dmg-файлы из простой спецификации json. Взгляните на readme на официальном сайте:https://github.com/LinusU/node-appdmg
пример:
установить appdmg
npm install -g appdmgнаписать файл json (
spec.json){ "title": "Test Title", "background": "background.png", "icon-size": 80, "contents": [ { "x": 192, "y": 344, "type": "file", "path": "TestApp.app" }, { "x": 448, "y": 344, "type": "link", "path": "/Applications" } ] }запустить программу
appdmg spec.json test.dmg(отказ от ответственности. Я создатель appdmg)
для тех из вас, кто интересуется этой темой, я должен упомянуть, как я создаю DMG:
hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"здесь
XXX == disk image file name (duh!) YYY == window title displayed when DMG is opened ZZZ == Path to a folder containing the files that will be copied into the DMG
Мои приложения, DropDMG, это простой способ создания образов дисков с фоновыми изображениями, макетами значков, пользовательскими значками томов и лицензионными соглашениями на программное обеспечение. Он может управляться из системы сборки с помощью инструмента командной строки" dropdmg " или AppleScript. При желании, изображения и лицензии RTF файлы могут быть сохранены в вашей системе управления версиями.
Я нашел это большое приложение mac для автоматизации процесса -http://www.araelium.com/dmgcanvas/ вы должны посмотреть, если вы создаете DMG installer для вашего mac app
Если вы хотите установить пользовательский значок Тома, то используйте команду ниже
/*Add a drive icon*/ cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns" /*SetFile -c icnC will change the creator of the file to icnC*/ SetFile -c icnC /<your path>/.VolumeIcon.icnsтеперь создать чтение / запись dmg
/*to set custom icon attribute*/ SetFile -a C /Volumes/dmgName
.DS_Store файлы хранит настройки windows в Mac. Настройки Windows включает в себя настройки иконок, фона окна, размер окна и т. д. Этот.Файл DS_Store необходим при создании окна для смонтированных образов для сохранения расположения файлов и фона windows.
Как только у вас есть .Файл DS_Store создан, вы можете просто скопировать его в созданный установщик (DMG).
Мне также нужно использовать подход командной строки для создания упаковки и dmg "программно в скрипте". Лучший ответ, который я нашел до сих пор, - это Adium project' Release building framework (см. R1). Существует пользовательский скрипт (AdiumApplescriptRunner), позволяющий избежать взаимодействия с графическим интерфейсом OSX WindowsServer. "osascript applescript.подход "scpt" требует, чтобы вы вошли в систему как строитель и запустили создание dmg из сеанса командной строки vt100.
система управления пакета OSX не настолько продвинутый по сравнению с другими Unixen, которые могут выполнять эту задачу легко и систематически.
я, наконец, получил это работает в моем проекте (который случается в Xcode). Добавление этих 3 скриптов в фазу сборки автоматически создаст образ диска для вашего продукта, который будет приятным и аккуратным. Все, что вам нужно сделать, это построить свой проект, и DMG будет ждать в вашей папке продуктов.
Сценарий 1 (Создание Образа Временного Диска):
#!/bin/bash #Create a R/W DMG dir="$TEMP_FILES_DIR/disk" dmg="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" rm -rf "$dir" mkdir "$dir" cp -R "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app" "$dir" ln -s "/Applications" "$dir/Applications" mkdir "$dir/.background" cp "$PROJECT_DIR/$PROJECT_NAME/some_image.png" "$dir/.background" rm -f "$dmg" hdiutil create "$dmg" -srcfolder "$dir" -volname "$PRODUCT_NAME" -format UDRW #Mount the disk image, and store the device name hdiutil attach "$dmg" -noverify -noautoopen -readwriteСкрипт 2 (Задать Свойства Окна Скрипта):
#!/usr/bin/osascript #get the dimensions of the main window using a bash script set {width, height, scale} to words of (do shell script "system_profiler SPDisplaysDataType | awk '/Main Display: Yes/{found=1} /Resolution/{width=; height=} /Retina/{scale=( == \"Yes\" ? 2 : 1)} /^ {8}[^ ]+/{if(found) {exit}; scale=1} END{printf \"%d %d %d\n\", width, height, scale}'") set x to ((width / 2) / scale) set y to ((height / 2) / scale) #get the product name using a bash script set {product_name} to words of (do shell script "printf \"%s\", $PRODUCT_NAME") set background to alias ("Volumes:"&product_name&":.background:some_image.png") tell application "Finder" tell disk product_name 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 {x, y, (x + 479), (y + 383)} set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 128 set background picture of theViewOptions to background set position of item (product_name & ".app") of container window to {100, 225} set position of item "Applications" of container window to {375, 225} update without registering applications close end tell end tellвышеуказанное измерение для работы окна для моего проект специально из-за размера моего фонового рисунка и разрешения значков; вам может потребоваться изменить эти значения для вашего собственного проекта.
Сценарий 3 (Сделать Окончательный Сценарий Образа Диска):
#!/bin/bash dir="$TEMP_FILES_DIR/disk" cp "$PROJECT_DIR/$PROJECT_NAME/some_other_image.png" "$dir/" #unmount the temp image file, then convert it to final image file sync sync hdiutil detach /Volumes/$PRODUCT_NAME rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg" hdiutil convert "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg" rm -f "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.temp.dmg" #Change the icon of the image file sips -i "$dir/some_other_image.png" DeRez -only icns "$dir/some_other_image.png" > "$dir/tmpicns.rsrc" Rez -append "$dir/tmpicns.rsrc" -o "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg" SetFile -a C "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.dmg" rm -rf "$dir"убедитесь, что файлы изображений, которые вы используете, находятся в каталоге $PROJECT_DIR/$PROJECT_NAME/!
для создания красивого DMG теперь вы можете просто использовать некоторые хорошо написанные открытые источники:
эти ответы слишком сложны, и времена изменились. Следующие работы на 10.9 просто отлично, разрешения правильные, и это выглядит красиво.
создать DMG только для чтения из каталога
#!/bin/sh # create_dmg Frobulator Frobulator.dmg path/to/frobulator/dir [ 'Your Code Sign Identity' ] set -e VOLNAME="" DMG="" SRC_DIR="" CODESIGN_IDENTITY="" 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="" DMG="" SRC_DIR="" ICON_FILE="" CODESIGN_IDENTITY="" 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}')" 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.
Я только что написал новую (дружественную) утилиту командной строки для этого. Он не полагается на Finder/AppleScript или на любой из (устаревших) API-интерфейсов Alias Manager, и его легко настроить и использовать.
в любом случае, любой, кто заинтересован можете найти его на PyPi; документация доступно на чтение документов.
Comments