Como faço para criar um DMG agradável para o Mac OS X usando ferramentas de linha de comando?

Eu preciso criar um bom instalador para uma aplicação Mac. Eu quero que seja uma imagem de disco (DMG), com um tamanho predefinido, layout e imagem de fundo.

Eu preciso fazer isso programaticamente em um script, para ser integrado em um sistema de compilação existente (na verdade, mais de um sistema de pacote, já que ele cria apenas instaladores. As compilações são feitas separadamente).

Eu já tenho a criação DMG feita usando "hdiutil", o que eu não descobri ainda é como fazer um layout de ícone e especificar um bitmap de fundo.

0
adicionado o autor Prof. Falken, fonte
Isso não é algo para perguntar diferente?
adicionado o autor Lenar Hoyt, fonte

14 Respostas

Se você quiser definir o ícone de volume personalizado, use o comando abaixo

/*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 //.VolumeIcon.icns

Agora crie dmg de leitura/gravação

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
0
adicionado
"seu caminho" é o nome DMG. (/ Volumes/dmgName)
adicionado o autor Parag Bafna, fonte
Você deve copiar o arquivo icns. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
adicionado o autor Parag Bafna, fonte
Você pode explicar o que o "seu caminho" significa aqui? Posso usar qualquer arquivo de ícones no disco, e SetFile iria copiá-lo, ou eu precisaria usar um arquivo que está dentro de .dmg? Eu só tenho um Mac, por isso é difícil testar se as coisas vão funcionar em outras máquinas.
adicionado o autor Milan Babuškov, fonte

Para aqueles de vocês que estão interessados ​​neste tópico, devo mencionar como eu crio o DMG:

hdiutil create XXX.dmg -volname "YYY" -fs HFS+ -srcfolder "ZZZ"

Onde

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
0
adicionado
Tudo bem, mas não resolve a necessidade real (imagem de fundo, posicionamento dos itens na pasta, etc.)
adicionado o autor Tom Bogle, fonte

Depois de muita pesquisa, eu encontrei esta resposta, e estou aqui colocando-a aqui como uma resposta para minha própria pergunta, para referência:

  1. Make sure that "Enable access for assistive devices" is checked in System Preferences>>Universal Access. It is required for the AppleScript to work. You may have to reboot after this change (it doesn't work otherwise on Mac OS X Server 10.4).

  2. Create a R/W DMG. It must be larger than the result will be. In this example, the bash variable "size" contains the size in Kb and the contents of the folder in the "source" bash variable will be copied into the 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
    
  3. Mount the disk image, and store the device name (you might want to use sleep for a few seconds after this operation):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Store the background picture (in PNG format) in a folder called ".background" in the DMG, and store its name in the "backgroundPictureName" variable.

  5. Use AppleScript to set the visual styles (name of .app must be in bash variable "applicationName", use variables for the other properties as needed):

    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
    
  6. Finialize the DMG by setting permissions properly, compressing and releasing it:

    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 
    

No Snow Leopard, o applescript acima não irá definir a posição do ícone corretamente - parece ser um bug do Snow Leopard. Uma solução é simplesmente chamar fechar/abrir depois de definir os ícones, ou seja:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
0
adicionado
Eu acho que eu encontrei uma pequena falha - há uma ejeção no AppleScript, o que é feito antes de tentar executar chmod. chmod falhará porque o disco agora é ejetado.
adicionado o autor Trejkaz, fonte
Ele permite que o applescript simule entrada de mouse e teclado e várias outras coisas.
adicionado o autor Ludvig A. Norin, fonte
A remoção das permissões de gravação na pasta de origem era necessária em uma das versões anteriores do hdiutil. Assume-se neste artigo que os comandos são executados como root, o que pode ou não ser necessário para que todas as outras partes funcionem. A versão atual do hdiutil não se importa com os privilégios de gravação na pasta de origem.
adicionado o autor Ludvig A. Norin, fonte
Não encontrei nenhuma maneira de esperar deterministicamente pela conclusão do comando 'atualizar sem registrar aplicativos'. Não estou certo de que o sono é necessário após o "anexo hdiutil", você terá que verificar a documentação (man hdiutil). A sincronização só deve ser necessária para ser chamada uma vez, eu faço isso duas vezes com o hábito antigo desde os bons e velhos dias do SunOS.
adicionado o autor Ludvig A. Norin, fonte
github.com/LinusU/node-appdmg <- ISSO SUPERA RESPOSTA ACIMA!
adicionado o autor Prof. Falken, fonte
chmod é totalmente inútil porque requer sudo e não realiza nada. O DMG resultante é completamente somente leitura independentemente.
adicionado o autor Barry, fonte
Excelente. Duas perguntas sobre isso: 1. Você recomenda sleep depois de amontoar a imagem. Quão mais? Não é possível esperar deterministicamente pela conclusão do processo? O mesmo para delay 5 no seu AppleScript. Eu sou sempre cauteloso com tempos de espera tão arbitrários, tendo tido uma experiência muito ruim com eles. 2. Na sua etapa 6, você chama sync duas vezes - por quê?
adicionado o autor Konrad Rudolph, fonte
Não consigo criar o atalho para a pasta "/ Applications" usando as etapas acima. Estou recebendo um "arquivo em branco" no lugar do atalho da pasta "/ Application".
adicionado o autor Nandhakumar, fonte
O que o passo 1 faz?
adicionado o autor Stephen, fonte
Se o script parar até expirar na linha "atualizar sem registrar aplicativos", a etapa 1 não foi concluída (ou foi desfeita). Eu acabei de descobrir isso da maneira mais difícil.
adicionado o autor jmaynard, fonte

Não vá lá. Como desenvolvedor de Mac a longo prazo, posso garantir que nenhuma solução está realmente funcionando bem. Eu tentei muitas soluções, mas elas não são muito boas. Eu acho que o problema é que a Apple realmente não documenta o formato de metadados para os dados necessários.

Aqui está como eu estou fazendo isso há muito tempo, com muito sucesso:

  1. Create a new DMG, writeable(!), big enough to hold the expected binary and extra files like readme (sparse might work).

  2. Mount the DMG and give it a layout manually in Finder or with whatever tools suits you for doing that (see FileStorm link at the bottom for a good tool). The background image is usually an image we put into a hidden folder (".something") on the DMG. Put a copy of your app there (any version, even outdated one will do). Copy other files (aliases, readme, etc.) you want there, again, outdated versions will do just fine. Make sure icons have the right sizes and positions (IOW, layout the DMG the way you want it to be).

  3. Unmount the DMG again, all settings should be stored by now.

  4. Write a create DMG script, that works as follows:

    • It copies the DMG, so the original one is never touched again.
    • It mounts the copy.
    • It replaces all files with the most up to date ones (e.g. latest app after build). You can simply use mv or ditto for that on command line. Note, when you replace a file like that, the icon will stay the same, the position will stay the same, everything but the file (or directory) content stays the same (at least with ditto, which we usually use for that task). You can of course also replace the background image with another one (just make sure it has the same dimensions).
    • After replacing the files, make the script unmount the DMG copy again.
    • Finally call hdiutil to convert the writable, to a compressed (and such not writable) DMG.

Este método pode não parecer ótimo, mas acredite, funciona muito bem na prática. Você pode colocar o DMG original (modelo DMG) mesmo sob controle de versão (por exemplo, SVN), então se você acidentalmente alterar/destruir, você pode simplesmente voltar para uma revisão onde ainda estava bem. Você pode adicionar o modelo DMG ao seu projeto Xcode, junto com todos os outros arquivos que pertençam ao DMG (readme, arquivo URL, imagem de fundo), todos sob controle de versão e então criar um alvo (ex: alvo externo chamado "Create DMG") e lá, rode o script DMG acima e adicione seu antigo alvo principal como alvo dependente. Você pode acessar arquivos na árvore do Xcode usando $ {SRCROOT} no script (é sempre a raiz de origem do seu produto) e pode acessar produtos de construção usando $ {BUILT_PRODUCTS_DIR} (é sempre o diretório onde o Xcode cria os resultados da construção) .

Resultado: Na verdade, o Xcode pode produzir o DMG no final da construção. Um DMG que está pronto para ser lançado. Não só você pode criar um DMG relase muito fácil dessa maneira, você pode realmente fazê-lo em um processo automatizado (em um servidor headless, se quiser), usando xcodebuild da linha de comando (builds noturnos automatizados, por exemplo).

Em relação ao layout inicial do modelo, FileStorm é uma boa ferramenta para fazê-lo. É comercial, mas muito poderoso e fácil de usar. A versão normal é inferior a US $ 20, por isso é realmente acessível. Talvez alguém possa automatizar o FileStorm para criar um DMG (por exemplo, via AppleScript), nunca tentou isso, mas depois de ter encontrado o modelo perfeito DMG, é realmente fácil atualizá-lo para cada versão.

0
adicionado
Separamos o processo do pacote do processo de construção, porque é feito por pessoas diferentes em momentos diferentes. O processo do pacote também cria instaladores para Windows, Windows CE, Symbian, AIX, Linux e Solaris.
adicionado o autor Ludvig A. Norin, fonte
Não é o mesmo cenário. Nós adicionamos produtos com freqüência, com pouca antecedência. A rotina manual mínima significa executar um script que fornece ao produto um nome e alguns outros atributos. Há razões além disso que nos levaram a tomar a decisão de não usar esse tipo de solução.
adicionado o autor Ludvig A. Norin, fonte
Eu já descartei a ideia de fazer assim, por várias razões. Aqui estão duas delas: o conteúdo dos instaladores varia de acordo com o produto e queremos confiar apenas no software instalado nas máquinas e nos scripts dos pacotes - uma rotina manual mínima para adicionar novos produtos.
adicionado o autor Ludvig A. Norin, fonte
Parece uma maneira feia de fazer isso, mas depois de tentar as abordagens acima, estou dando um giro. Mas depois que eu substituir os arquivos e desanexar, minha imagem não é alterada e não contém os novos arquivos. O que eu posso estar fazendo errado? hdiutil attach "$ COPY_OF_IMAGE" -readwrite -mountpoint "$ STAGING_DIR" localizar "$ DEST_KM_APP" -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf cp -fR "$ SOURCE_KM_APP /" "$ DEST_KM_APP" hdiutil desanexar $ STAGING_DIR $ VERBOSIDADE
adicionado o autor Tom Bogle, fonte
Parece que essa abordagem funciona: crazyedy.com/tech/?p=535
adicionado o autor Tom Bogle, fonte
Este é o mesmo cenário que nós temos. Temos mais de uma dúzia de produtos; cada um tem um DMG totalmente diferente. A criação de um modelo DMG por produto é uma tarefa única e leva alguns minutos. E o que você quer dizer com "instalador"? PKG/MPKG instalar pacotes?
adicionado o autor Mecki, fonte
@Ivan: Você está certo - consertando a resposta. Desculpe por esse erro de digitação
adicionado o autor Mecki, fonte
Você provavelmente está se referindo ao hdiutil, não ao hdutil.
adicionado o autor Ivan Vučica, fonte
Se você quiser que a janela raiz da imagem do disco seja aberta quando a imagem for montada, adicione o seguinte à etapa 2: bless --openfolder "/ Volumes/My Great Software" .
adicionado o autor bleater, fonte
Para mim - a versão com script acima não funcionou (ela recusaria consistentemente criar o link Applications). O uso desse método funcionou bem e de maneira confiável, apesar de exigir que esse processo manual fosse configurado.
adicionado o autor Chris R, fonte

Essas respostas são muito complicadas e os tempos mudaram. O seguinte funciona em 10.9 muito bem, as permissões estão corretas e parece bom.

Criar um DMG somente leitura de um diretório

#!/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

Criar DMG somente leitura com um ícone (tipo .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

Se mais alguma coisa precisar acontecer, o mais fácil é criar uma cópia temporária do SRC_DIR e aplicar as mudanças antes de criar um DMG.

0
adicionado
Esta resposta não está adicionando nada ao que foi escrito anteriormente, e também não responde à pergunta original (não se trata apenas de colocar um ícone no dmg, ou como assiná-lo; a questão é adicionar gráficos e posicionar ícones programaticamente para um dmg).
adicionado o autor Ludvig A. Norin, fonte

Eu encontrei este ótimo aplicativo mac para automatizar o processo - http://www.araelium.com/dmgcanvas/ você deve dar uma olhada se você está criando o instalador dmg para o seu aplicativo mac

0
adicionado
adicionado o autor Prof. Falken, fonte
Este é grátis: link
adicionado o autor NetworkSys Co. Ltd, fonte
Note que este não é um programa gratuito, por isso não é adequado para muitos ambientes.
adicionado o autor jmaynard, fonte

Há um pequeno script Bash chamado create-dmg que cria DMGs com fundos personalizados, posicionamento personalizado de ícones e nome do volume.

Eu o construí há muitos anos para a empresa que eu dirigia na época; ele sobrevive da contribuição de outras pessoas desde então, e supostamente funciona bem.

Há também o node-appdmg que parece um esforço mais moderno e ativo baseado no Node.js; confira também.

0
adicionado
adicionado o autor David Karlsson, fonte
O create-dmg NÃO posiciona bem o ícone. Se você precisar desse recurso, não o use.
adicionado o autor laike9m, fonte
@AndreyTarantsov Já existe um problema github.com/andreyvit/create-dmg/issues/18 .
adicionado o autor laike9m, fonte
@AndreyTarantsov Eh, é o seu projeto, achei que você está ciente de todas essas questões ...
adicionado o autor laike9m, fonte
@ laike9m Você pode relatar isso como um problema, se você sabe detalhes? Talvez alguém conserte.
adicionado o autor Andrey Tarantsov, fonte
@ laike9m Interessante, não sabia disso. Obrigado.
adicionado o autor Andrey Tarantsov, fonte
@ laike9m Já faz mais de 5 anos desde a última vez que toquei. Eu realmente não considero DMGs a melhor maneira de distribuir software Mac mais. Por isso, sobrevive com contribuições de outros - esperamos que alguém descubra a questão dos ícones também.
adicionado o autor Andrey Tarantsov, fonte
@Zmey Bem, como usuário, eu prefiro arquivos zip de longe. Pontos de bônus para cópia automática para /Applications se o aplicativo detectar que está sendo executado em ~/Downloads . Veja também este artigo antigo de John Gruber .
adicionado o autor Andrey Tarantsov, fonte
adicionado o autor Andrey Tarantsov, fonte
Essa coisa funciona muito bem!
adicionado o autor vpicaver, fonte
@AndreyTarantsov ajuda muito.
adicionado o autor simon xu, fonte
O link para o seu script bash está quebrado. Você pode colocá-lo em uma essência em github.com? obrigado
adicionado o autor dquimper, fonte
@AndreyTarantsov Obrigado! É uma ideia muito interessante.
adicionado o autor Zmey, fonte
@AndreyTarantsov Qual o caminho que você acha que é o melhor para a distribuição de aplicativos para Mac?
adicionado o autor Zmey, fonte
@AndreyTarantsov bom trabalho, obrigado!
adicionado o autor finnan, fonte

Arquivos .DS_Store armazena as configurações do Windows no Mac. As configurações do Windows incluem o layout dos ícones, o plano de fundo da janela, o tamanho da janela, etc. O arquivo .DS_Store é necessário na criação da janela para imagens montadas para preservar a disposição dos arquivos e o plano de fundo das janelas.

Depois de criar o arquivo .DS_Store, basta copiá-lo para o instalador criado (DMG).

0
adicionado
Mas primeiro adicione uma imagem de fundo ao dmg nomeando-a algo como .background.png e, em seguida, usando Cmd-J para adicionar essa (!) Imagem ao fundo.
adicionado o autor Gijs, fonte

Meu aplicativo, DropDMG , é uma maneira fácil de criar imagens de disco com imagens de plano de fundo, layouts de ícones, volume personalizado ícones e contratos de licença de software. Pode ser controlado a partir de um sistema de compilação através da ferramenta de linha de comando "dropdmg" ou AppleScript. Se desejar, os arquivos RTF de imagem e licença podem ser armazenados em seu sistema de controle de versão.

0
adicionado
Ótimo, obrigada! É possível redimensionar sem imagem de fundo?
adicionado o autor avi, fonte
Parece bom, mas não parece ter a opção de redimensionar a janela.
adicionado o autor avi, fonte
adicionado o autor Prof. Falken, fonte
Isso parece muito interessante.
adicionado o autor Konrad Rudolph, fonte
Minha equipe tem este trabalho lindamente e automaticamente em um servidor de criação de CI Jenkins, completo com fundo, arraste para o alias de aplicativos. Executar, não ande, para DropDMG para fazer imagens de disco.
adicionado o autor Paul Collins, fonte
@avi O DropDMG dimensiona automaticamente a janela para a imagem de plano de fundo que você define (ou insira nessa imagem se desejar).
adicionado o autor Michael Tsai, fonte
@avi Se você não estiver usando uma imagem de plano de fundo, poderá definir as dimensões usando o “BlankBackgroundSize” preferência esotérica .
adicionado o autor Michael Tsai, fonte
Bom aplicativo, vou comprá-lo depois que meu teste expirar.
adicionado o autor kilik52, fonte

Eu também preciso usar a abordagem de linha de comando para fazer o empacotamento e criação de dmg "programaticamente em um script". A melhor resposta que encontrei até agora é da estrutura de criação de versões do projeto Adium (Veja R1). Há um script personalizado (AdiumApplescriptRunner) para permitir que você evite a interação da GUI do OSX com o WindowsServer. A abordagem "osascript applescript.scpt" exige que você efetue login como construtor e execute a criação de dmg a partir de uma sessão de linha de comando vt100.

O sistema de gerenciamento de pacotes do OSX não é tão avançado comparado a outros Unixen que podem fazer essa tarefa de maneira fácil e sistemática.

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

0
adicionado

Acabei de escrever um novo utilitário de linha de comando (amigável) para fazer isso. Ele não depende do Finder/AppleScript nem de nenhuma das (obsoletas) APIs do Alias ​​Manager, e é fácil de configurar e usar.

De qualquer forma, quem estiver interessado pode encontrá-lo no PyPi ; a documentação é disponível em Read The Docs .

0
adicionado

Colocando esta questão atualizada fornecendo esta resposta.

appdmg is a simple, easy-to-use, open-source command line program that creates dmg-files from a simple json specification. Take a look at the readme at the official website:

https://github.com/LinusU/node-appdmg

Exemplo rápido:

  1. Install appdmg

    npm install -g appdmg
    
  2. Write a json file (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" }
      ]
    }
    
  3. Run program

    appdmg spec.json test.dmg
    

(disclaimer. Eu sou o criador do appdmg)

0
adicionado
@Creator: você pode, por favor, fazer avançar como esta oferta GUI sem ter que arrastar e soltar? s.sudre.free.fr/Software/Packages/about.html
adicionado o autor YumYumYum, fonte
Simples e eficaz. A única desvantagem é que requer npm para ser instalado
adicionado o autor Jack James, fonte
@Joey, você poderia abrir um problema no repositório do Github se não funcionar para você?
adicionado o autor Linus Unnebäck, fonte
Se o arquivo .app não estiver na mesma pasta que o arquivo json, isso não funcionará, ele fornecerá o erro "arquivo não encontrado" quando você especificar um caminho relativo em "caminho"
adicionado o autor Joey, fonte

Eu finalmente consegui isso funcionando no meu próprio projeto (que está no Xcode). Adicionar esses 3 scripts à sua fase de criação criará automaticamente uma imagem de disco para seu produto que seja agradável e organizada. Tudo o que você precisa fazer é construir o seu projeto e o DMG estará esperando na pasta de seus produtos.

Script 1 (Criar Imagem de Disco Temp):

#!/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

Script 2 (Definir Script de Propriedades da Janela):

#!/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=$2; height=$4} /Retina/{scale=($2 == \"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

A medição acima para o trabalho de janela para o meu projeto especificamente devido ao tamanho da minha foto de fundo e resolução de ícone; você pode precisar modificar esses valores para seu próprio projeto.

Script 3 (criar o script de imagem final do disco):

#!/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"

Verifique se os arquivos de imagem que você está usando estão no diretório $ PROJECT_DIR/$ PROJECT_NAME /!

0
adicionado
Está criando uma imagem de disco em branco no meu projeto. Alguma sugestão.
adicionado o autor ManiaChamp, fonte
A parte do script de shell funciona apenas, mas como posso adicionar o script da Apple com o Shell Script em RunScript na fase de compilação, ele está mostrando o erro, cada instrução de script da Apple é um símbolo não encontrado.
adicionado o autor ManiaChamp, fonte

Para criar um DMG agradável, agora você pode usar apenas algumas fontes abertas bem escritas:

0
adicionado
Eu decidi instalar o node-appdmg. É bom para o que eu preciso.
adicionado o autor Pamela Cook - LightBe Corp, fonte
O link para dmgbuild não funciona.
adicionado o autor Pamela Cook - LightBe Corp, fonte
@ PamelaCook-LightBeCorp No caso de você ainda está interessado. O link para dmgbuild foi corrigido.
adicionado o autor SubOptimal, fonte
Pode ser que eles mudaram isso. Você pode usar create-dmg e node-appdmg. Estou usando o create-dmg. É bom.
adicionado o autor Anni S, fonte