220 votes

Comment créer un joli DMG pour Mac OS X en utilisant les outils de ligne de commande ?

J'ai besoin de créer un joli programme d'installation pour une application Mac. Je veux qu'il soit une image disque (DMG), avec une taille prédéfinie, la mise en page et l'image de fond.

J'ai besoin de le faire par programmation dans un script, pour être intégré dans un système de construction (plus d'un système pack vraiment, puisqu'il ne fait que créer des installateurs. Les constructions sont réalisées séparément).

J'ai déjà le DMG création fait à l'aide de "hdiutil", ce que je n'ai pas trouvé encore est de savoir comment faire une icône de mise en page et de spécifier une image d'arrière-plan.

202voto

Ludvig A Norin Points 2094

Après beaucoup de recherches, j'ai trouvé cette réponse, et je suis, par la présente, de le mettre ici une réponse à ma propre question, pour la référence:

  1. Assurez-vous que l'option "Activer l'accès pour les périphériques d'aide" est cochée dans les Préférences Système>>de l'Accès Universel. Il est nécessaire pour l'AppleScript pour travailler. Vous pourriez avoir à redémarrer après ce changement (il ne fonctionne pas sinon sur Mac OS X Server 10.4).

  2. Créer une R/W DMG. Il doit être plus grand que le résultat va être. Dans cet exemple, la fête de la variable "taille" contient la taille en Ko et le contenu du dossier dans le dossier "source" bash variable sera copié dans le 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. Monter l'image disque, et de stocker le nom de l'appareil (vous pouvez utiliser le sommeil pendant quelques secondes après cette opération):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Magasin de l'arrière-plan de l'image (au format PNG) dans un dossier appelé ".arrière-plan" dans le DMG, et de stocker son nom dans le "backgroundPictureName" à la variable.

  5. Utiliser AppleScript pour définir les styles visuels (nom de l' .l'application doit être en bash variable "applicationName", utiliser des variables pour les autres propriétés si nécessaire):

    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 le DMG en définissant correctement les permissions, la compression et de la libérer:

    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 
    

Sur Snow Leopard, le ci-dessus applescript ne va pas régler la position de l'icône correctement - il semble être un Léopard des Neiges bug. Une solution de contournement est de simplement appeler fermer/ouvrir après le réglage, les icônes, c'est à dire:

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

59voto

Andrey Tarantsov Points 4487

Nous avons un petit script Bash appelé créez-dmg que les constructions de fantaisie DMGs avec des arrière-plans personnalisés, personnalisés icône de positionnement et de nom de volume. N'hésitez pas à utiliser comme bon vous semble.

Nous exécuter un script AppleScript pour redimensionner la fenêtre et la position des icônes de la propriété. Il fonctionne très bien. Il a été emprunté à Adium du processus de construction, de sorte qu'il semble fonctionner très bien pour eux aussi.

Je ne sais pas comment créez-dmg compare à buildDMG, mais buildDMG semble avoir la dernière mise à jour publiée il y a 5 ans.

Mise à jour: on dirait qu'il ya une version mise à jour sur github qui ne nécessite pas la Adium applescript coureur de l'outil.

38voto

Mecki Points 35351

Ne pas y aller. À long terme à un développeur Mac, je peux vous assurer, aucune solution n'est vraiment bien. J'ai essayé beaucoup de solutions, mais ils sont tous trop bien. Je pense que le problème c'est que Apple n'a pas vraiment de document de la méta format de données pour les données nécessaires.

Voici comment je le fais depuis longtemps, avec beaucoup de succès:

  1. Créer un nouveau DMG, les droits en écriture(!), assez grande pour contenir le devrait binaire et les autres fichiers comme le fichier readme (sparse pourrait fonctionner).

  2. Monter le DMG et lui donner une mise en page manuellement dans le Finder ou avec tous les outils qui vous convient pour cela (voir FileStorm lien en bas pour un bon outil). L'image de fond est généralement une image que nous avons mis dans un dossier caché (".quelque chose") sur le DMG. Placez une copie de votre application (n'importe quelle version, même périmés on va faire). Copier d'autres fichiers (alias, readme, etc.) vous voulez là encore, les anciennes versions fera l'amende juste. Assurez-vous que les icônes ont le droit de tailles et de positions (OIE, la mise en page du DMG de la façon dont vous voulez qu'il soit).

  3. Démonter à nouveau le DMG, tous les paramètres doivent être sauvegardés.

  4. Écrire un créer DMG script, qui fonctionne comme suit:

    • Il copie le fichier DMG, de sorte que l'original n'est jamais touché à nouveau.
    • Il monte la copie.
    • Il remplace tous les fichiers avec la plus à jour (p. ex. dernière application après la construction). Vous pouvez simplement utiliser mv ou idem pour, que sur la ligne de commande. Remarque, quand vous remplacez un fichier comme ça, l'icône reste la même, la position reste la même, mais tout le fichier (ou le répertoire) contenu reste le même (au moins avec idem, à qui nous avons l'habitude d'utiliser pour cette tâche). Bien sûr, vous pouvez également remplacer l'image d'arrière-plan à un autre (assurez-vous qu'il a les mêmes dimensions).
    • Après le remplacement des fichiers, le script de démonter le DMG copier à nouveau.
    • Enfin appeler hdiutil pour convertir l'écriture, pour un comprimé (et pas accessible en écriture) DMG.

Cette méthode peut ne pas sembler optimale, mais croyez-moi, cela fonctionne très bien dans la pratique. Vous pouvez placer l'original DMG (DMG modèle), même sous contrôle de version (par exemple, SVN), donc si jamais vous accidentellement modifier/détruire, vous pouvez simplement revenir à une révision où il était encore en bon état. Vous pouvez ajouter la DMG modèle de votre projet Xcode, ensemble avec tous les autres fichiers qui appartiennent sur le DMG (readme, l'URL du fichier, image d'arrière-plan), le tout sous contrôle de version, puis de créer une cible (par exemple, cible externe nommé "Créer DMG") et exécutez le fichier DMG script ci-dessus et ajouter votre ancien cible principale comme dépendant de la cible. Vous pouvez accéder à des fichiers dans Xcode arbre à l'aide de ${SRCROOT} dans le script (qui est toujours la source de la racine de votre produit) et vous pouvez accéder à des produits de construction en utilisant ${BUILT_PRODUCTS_DIR} (c'est toujours le répertoire où Xcode crée les résultats de la compilation).

Résultat: en Fait, Xcode peut produire le DMG à la fin de la construction. Un DMG qui est prêt à sortir. Non seulement vous pouvez créer un relase DMG assez facile de cette façon, vous pouvez réellement le faire dans un processus automatisé (sur une tête serveur si vous le souhaitez), à l'aide de xcodebuild en ligne de commande automatisés (nightly builds par exemple).

Concernant la mise en page initiale du modèle, FileStorm est un bon outil pour le faire. Il est commercial, mais très puissant et facile à utiliser. La version normale est de moins de 20$, il est vraiment abordable. Peut-être que l'on peut automatiser FileStorm créer un DMG (par exemple, via AppleScript), jamais essayé, mais une fois que vous avez trouvé le modèle parfait de DMG, il est vraiment facile de le mettre à jour pour chaque version.

22voto

Ludvig A Norin Points 2094

Pour ceux d'entre vous qui sont intéressés par ce sujet, je dois mentionner comment créer le DMG :

13voto

Michael Tsai Points 806

Mon application, DropDMG, est un moyen facile de créer des images disque avec les images d’arrière-plan, mises en icône, icônes de volume personnalisé et contrats de licence de logiciel. Il peut être contrôlé à partir d’un système de build via l’outil de ligne de commande « dropdmg » ou AppleScript. Si vous le souhaitez, les fichiers RTF de photo et de la licence peuvent être stockés sous votre système de contrôle de version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X