211 votos

¿Cómo puedo crear una DMG para Mac OS X de aspecto agradable el uso de herramientas de línea de comandos?

Necesito crear un instalador para una aplicación de Mac. Quiero que sea una imagen de disco (DMG), con un tamaño predefinido, el diseño y la imagen de fondo.

Necesito hacer esto mediante programación en un script, para ser integrado en el sistema de construcción (más de un pack del sistema realmente, ya que sólo crear instaladores. Las generaciones se hace por separado).

Ya tengo el DMG creación se realiza a través de "hdiutil", lo que no he encontrado todavía, es cómo hacer un icono de diseño y especificar un mapa de bits de fondo.

198voto

Ludvig A Norin Puntos 2094

Después de mucha investigación, me he encontrado con esta respuesta, y estoy por la presente ponerlo aquí como una respuesta a mi propia pregunta, para tener una referencia:

  1. Asegúrese de que "Permitir el acceso para dispositivos de ayuda" está activada en las Preferencias del Sistema>>Acceso Universal. Es necesario para que el AppleScript para el trabajo. Puede que tenga que reiniciar después de este cambio (no funciona de otra manera en Mac OS X Server 10.4).

  2. Crear un R/W de la DMG. Debe ser mayor que el resultado va a ser. En este ejemplo, la fiesta de la variable "tamaño" contiene el tamaño en Kb y el contenido de la carpeta en la "fuente" de bash variable será copiado en el 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. Montar la imagen de disco, y almacenar el nombre del dispositivo (puede que usted quiera usar dormir por un par de segundos después de esta operación):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Almacén de la imagen de fondo (en formato PNG) en una carpeta llamada ".background" en el DMG, y guarde su nombre en el "backgroundPictureName" de la variable.

  5. El uso de AppleScript para establecer los estilos visuales (nombre de la .app debe estar en bash variable "applicationName", se utilizan las variables del resto de las propiedades según sea necesario):

    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
               eject
         end tell
       end tell
    ' | osascript
    
  6. Finialize el DMG mediante el establecimiento de permisos correctamente, comprimir y soltar:

    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 
    

En Snow Leopard, la de arriba applescript no cambiará el icono de la posición correctamente - que parece ser un Snow Leopard error. Una solución es simplemente llame al cerrar/abrir después de la configuración de los iconos, es decir:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open

56voto

Andrey Tarantsov Puntos 4487

Tenemos un pequeño script en Bash se llama crear-dmg que construye la fantasía DMGs con fondos personalizados, icono personalizado de posicionamiento y el nombre del volumen. Siéntase libre de utilizar como más te guste.

Podemos ejecutar AppleScript para cambiar el tamaño de la ventana y la posición de los iconos de la propiedad. Funciona muy bien. Fue tomado de Adium del proceso de construcción, por lo que parece que funciona bien para ellos también.

No sé cómo crear-dmg compara a buildDMG, pero buildDMG parece tener la ultima actualización publicada hace 5 años.

Actualización: Parece que hay una versión actualizada en github que no requiere de la Adium applescript corredor de la herramienta.

37voto

Mecki Puntos 35351

No vayas allí. Como un largo plazo de desarrolladores de Mac, te puedo asegurar que no hay solución está funcionando realmente bien. He intentado muchas soluciones, pero no son todos demasiado buenos. Creo que el problema es que Apple no realmente documento de la meta de formato de datos para los datos necesarios.

He aquí cómo lo estoy haciendo por un largo tiempo, con gran éxito:

  1. Crear un nuevo DMG, escribible(!), suficientemente grande para soportar la espera binarios y los archivos adicionales como léame (escasos podría funcionar).

  2. Monte el DMG y darle un diseño de forma manual en el Finder o con cualquier herramienta que se adapte a usted para hacer eso (ver FileStorm enlace en la parte inferior para una buena herramienta). La imagen de fondo es generalmente una imagen que hemos puesto en una carpeta oculta (".something") en el DMG. Ponga una copia de su aplicación no (cualquier versión, incluso anticuado). Copiar otros archivos (alias, readme, etc.) usted quiere allí, de nuevo, versiones no actualizadas va a hacer muy bien. Asegúrese de que los iconos tienen el derecho de los tamaños y las posiciones (IOW, el diseño de la DMG de la manera que usted desea que lo sea).

  3. Desmontar el DMG de nuevo, todos los valores deben ser almacenados por ahora.

  4. Escribir un crear DMG script, que funciona de la siguiente manera:

    • Copia el DMG, por lo que el original nunca se tocó de nuevo.
    • Monta la copia.
    • Reemplaza todos los archivos con la mayoría hasta la fecha (por ej. última aplicación después de la construcción). Usted puede simplemente utilizar mv o ditto para que en la línea de comandos. Tenga en cuenta, cuando se reemplaza un archivo como ese, el icono permanecerá el mismo, la situación seguirá siendo la misma, pero todo el archivo (o directorio) el contenido sigue siendo el mismo (al menos con lo mismo, que normalmente utilizamos para esa tarea). Por supuesto, también puede reemplazar la imagen de fondo con otro (sólo asegúrese de que tiene las mismas dimensiones).
    • Después de reemplazar los archivos, hacer que el script desmontar el DMG copia de nuevo.
    • Finalmente llamar hdiutil para convertir la escritura, a un comprimido (y tal no modificable) DMG.

Este método puede no un sonido óptimo, pero confía en mí, funciona muy bien en la práctica. Usted puede poner el original DMG (DMG plantilla) aún bajo el control de versiones (ej. SVN), así que si alguna vez, accidentalmente, cambiar o destruir, usted puede ir de nuevo a una revisión donde fue bien. Usted puede agregar el DMG de la plantilla para su proyecto de Xcode, junto con todos los otros archivos que pertenecen a la DMG (léame, de la dirección URL del archivo, la imagen de fondo), todos bajo el control de versiones y, a continuación, crear un objetivo (p. ej. objetivo externo denominado "Crear DMG"), y ejecutar el DMG de secuencia de comandos de arriba y agregar a su antiguo principal objetivo como dependiente de destino. Usted puede acceder a los archivos en el árbol usando Xcode ${SRCROOT} en el script (es siempre la fuente de la raíz de su producto) y se puede acceder a la construcción de los productos mediante el uso de ${BUILT_PRODUCTS_DIR} (siempre es el directorio donde Xcode crea la acumulación de resultados).

Resultado: en Realidad Xcode puede producir la DMG en la final de la generación. Un DMG que está listo para liberar. No sólo puede crear un relase DMG bastante fácil de esa manera, en realidad se puede hacer así en un proceso automatizado (en una cabeza de servidor si te gusta), utilizando xcodebuild de línea de comandos (automatizado nightly builds, por ejemplo).

Con respecto a la disposición inicial de la plantilla, FileStorm es una buena herramienta para hacerlo. Es comercial, pero muy potente y fácil de usar. La versión normal es menos de $20, por lo que es realmente asequible. Tal vez se puede automatizar FileStorm para crear un DMG (p. ej. mediante AppleScript), nunca se trató de eso, pero una vez hayas encontrado la plantilla perfecta DMG, es realmente fácil actualizarlo con cada nueva versión.

22voto

Ludvig A Norin Puntos 2094

Para aquellos de ustedes que están interesados ​​en este tema, debo mencionar cómo creo la DMG:

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

donde

 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
 

13voto

Michael Tsai Puntos 806

Mi aplicación, DropDMG , es una manera fácil de crear imágenes de disco con imágenes de fondo, icono diseños, iconos de volumen a medida, y los acuerdos de licencia de software. Puede ser controlado desde un sistema de construcción a través de la "DropDMG" herramienta de línea de comandos o AppleScript. Si se desea, los archivos RTF de imagen y de licencia se pueden almacenar en su sistema de control de versiones.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X