Question

Je dois créer un joli programme d'installation pour une application Mac. Je veux que ce soit une image disque (DMG), avec une taille, une mise en page et une image d'arrière-plan prédéfinies.

Je dois le faire par programme dans un script, pour être intégré dans un système de construction existant (plutôt un système pour packs, puisqu'il ne crée que des installateurs. Les versions sont réalisées séparément).

La création de DMG a déjà été effectuée à l'aide de "hdiutil". Ce que je n'ai pas encore découvert, c'est comment créer une disposition des icônes et spécifier un bitmap d'arrière-plan.

Était-ce utile?

La solution

Après de nombreuses recherches, j'ai trouvé cette réponse et je la présente ici comme réponse à ma propre question, par référence:

  1. Assurez-vous que "Activer l'accès pour les appareils et accessoires fonctionnels" est cochée dans Préférences Système > > Accès universel. Il est nécessaire que AppleScript fonctionne. Vous devrez peut-être redémarrer après cette modification (cela ne fonctionne pas sous Mac OS X Server 10.4).

  2. Créez un fichier DMG R / W. Il doit être plus grand que le résultat sera. Dans cet exemple, la variable bash " size " contient la taille en Ko et le contenu du dossier dans le dossier "source". La variable bash sera copiée dans le fichier 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. Montez l'image du disque et stockez le nom du périphérique (vous pouvez utiliser le mode veille 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. Stockez l’image d’arrière-plan (au format PNG) dans un dossier nommé ".background". dans le fichier DMG et enregistrez son nom dans le répertoire "backgroundPictureName". variable.

  5. Utilisez AppleScript pour définir les styles visuels (le nom de .app doit être dans la variable bash "quotName", utilisez des variables pour les autres propriétés, le cas échéant):

    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. Finalisez le fichier DMG en définissant correctement les autorisations, en le compressant et en le relâchant:

    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, l’applicateur de pomme ci-dessus ne définira pas correctement la position de l’icône. Il semble s’agir d’un bogue de Snow Leopard. Une solution consiste simplement à appeler fermer / ouvrir après avoir défini 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

Autres conseils

Il existe un petit script Bash appelé create-dmg qui permet de créer des groupes de stockage fantaisie avec des arrière-plans et des environnements personnalisés. Positionnement des icônes et nom du volume.

Je l'ai construit il y a de nombreuses années pour la société que je dirigeais à l'époque; depuis lors, il survit grâce à la contribution d'autres personnes et fonctionnerait bien.

Il existe également un node-appdmg qui ressemble à un effort plus moderne et actif basé sur Node. js; vérifiez aussi.

N'y allez pas. En tant que développeur Mac à long terme, je peux vous assurer qu'aucune solution ne fonctionne vraiment bien. J'ai essayé tellement de solutions, mais elles ne sont pas toutes bonnes. Je pense que le problème est que Apple ne documente pas vraiment le format de métadonnées pour les données nécessaires.

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

  1. Créez un nouveau fichier DMG, inscriptible (!), suffisamment volumineux pour contenir les fichiers binaires et supplémentaires attendus, tels que le fichier Lisez-moi (peu de données peuvent fonctionner).

  2. Montez le fichier DMG et attribuez-lui une mise en page manuellement dans le Finder ou avec les outils de votre choix (voir le lien FileStorm en bas pour un bon outil). L'image d'arrière-plan est généralement une image que nous avons placée dans un dossier caché (".something") sur le fichier DMG. Mettez une copie de votre application là-bas (n'importe quelle version, même périmée, fera l'affaire). Copiez les autres fichiers (alias, readme, etc.) de votre choix, là encore, les versions obsolètes feront l'affaire. Assurez-vous que les icônes ont la bonne taille et la bonne position (IOW, organisez le fichier DMG comme vous le souhaitez).

  3. Démontez à nouveau le DMG. Tous les paramètres doivent maintenant être enregistrés.

  4. Écrivez un script de création DMG, qui fonctionne comme suit:

    • Il copie le fichier DMG afin que celui d'origine ne soit plus jamais touché.
    • Il monte la copie.
    • Il remplace tous les fichiers par les fichiers les plus récents (par exemple, la dernière application après la construction). Vous pouvez simplement utiliser mv ou idem pour cela en ligne de commande. Notez que lorsque vous remplacez un fichier comme celui-ci, l'icône reste la même, la position reste la même, tout sauf le contenu du fichier (ou du répertoire) reste la même (au moins avec idem, que nous utilisons habituellement pour cette tâche). . Vous pouvez bien sûr également remplacer l’image d’arrière-plan par une autre (assurez-vous simplement qu’elle a les mêmes dimensions).
    • Après avoir remplacé les fichiers, faites en sorte que le script démonte à nouveau la copie DMG.
    • Enfin, appelez hdiutil pour convertir le fichier inscriptible en un fichier DMG compressé (et non inscriptible).

Cette méthode ne semble pas optimale, mais croyez-moi, cela fonctionne très bien dans la pratique. Vous pouvez placer le modèle DMG d'origine (modèle DMG) même sous contrôle de version (par exemple, SVN). Ainsi, si vous le modifiez / détruisez par inadvertance, vous pouvez simplement revenir à une révision où tout allait bien. Vous pouvez ajouter le modèle DMG à votre projet Xcode, ainsi que tous les autres fichiers appartenant à DMG (fichier readme, fichier URL, image d'arrière-plan), le tout sous contrôle de version, puis créer une cible (par exemple, une cible externe nommée "Créer un fichier DMG"). ) et exécutez le script DMG ci-dessus et ajoutez votre ancienne cible principale en tant que cible dépendante. Vous pouvez accéder aux fichiers de l'arborescence Xcode en utilisant $ {SRCROOT} dans le script (c'est toujours la racine source de votre produit) et vous pouvez accéder aux produits de construction en utilisant $ {BUILT_PRODUCTS_DIR} (c'est toujours le répertoire dans lequel Xcode crée les résultats de la construction). .

Résultat: Xcode peut produire le fichier DMG à la fin de la construction. Un DMG prêt à être publié. Non seulement vous pouvez créer un fichier DMG assez facile, mais vous pouvez également le faire dans un processus automatisé (sur un serveur sans tête si vous le souhaitez), en utilisant xcodebuild à partir de la ligne de commande (versions nocturnes automatisées, par exemple).

Concernant la présentation initiale du modèle, FileStorm est un bon outil pour le faire. C'est commercial, mais très puissant et facile à utiliser. La version normale coûte moins de 20 dollars, elle est donc très abordable. On peut peut-être automatiser FileStorm pour créer un fichier DMG (par exemple, via AppleScript), jamais essayé, mais une fois que vous avez trouvé le modèle DMG idéal, il est vraiment facile de le mettre à jour pour chaque version.

Mettre à jour cette question en fournissant cette réponse.

appdmg est un programme de ligne de commande open source simple à utiliser, qui crée des fichiers dmg à partir d'une simple spécification JSON. Consultez le readme sur le site officiel:

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

Exemple rapide:

  1. Installer appdmg

    npm install -g appdmg
    
  2. Écrire un fichier 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" }
      ]
    }
    
  3. Exécuter le programme

    appdmg spec.json test.dmg
    

(disclaimer. Je suis le créateur de appdmg)

Pour ceux d'entre vous qui s'intéressent à ce sujet, je dois mentionner comment j'ai créé le 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

Mon application, DropDMG , permet de créer facilement des images de disque avec des images d'arrière-plan et des icônes. , icônes de volume personnalisées et contrats de licence logicielle. Il peut être contrôlé à partir d’un système de compilation via l’option "dropdmg". outil de ligne de commande ou AppleScript. Si vous le souhaitez, les fichiers image et sous licence RTF peuvent être stockés dans votre système de contrôle de version.

J'ai trouvé cette excellente application pour automatiser le processus - http://www.araelium.com/dmgcanvas/ vous devez jeter un coup d’œil si vous créez un programme d’installation de dmg pour votre application mac

Si vous souhaitez définir une icône de volume personnalisé, utilisez la commande ci-dessous

/*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

Créez maintenant un dmg en lecture / écriture

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName

Pour créer un joli DMG, vous pouvez maintenant utiliser des sources ouvertes bien écrites:

Les fichiers .DS_Store stockent les paramètres Windows dans Mac. Les paramètres Windows incluent la disposition des icônes, l’arrière-plan de la fenêtre, la taille de la fenêtre, etc. Le fichier .DS_Store est nécessaire pour créer la fenêtre des images montées afin de préserver la disposition des fichiers et l’arrière-plan de la fenêtre.

Une fois le fichier .DS_Store créé, vous pouvez simplement le copier sur votre programme d'installation créé (DMG).

J'ai également besoin d'utiliser une approche en ligne de commande pour créer le packaging et la création de dmg "par programmation dans un script". La meilleure réponse que j’ai trouvée jusqu’à présent est tirée du projet Adium 'Release building framework (voir R1). Il existe un script personnalisé (AdiumApplescriptRunner) qui vous permet d’éviter les interactions entre l’interface graphique OSX WindowsServer. "osScript applescript.scpt" vous obliger à vous connecter en tant que générateur et à exécuter la création de dmg à partir d'une session vt100 en ligne de commande.

Le système de gestion de paquets OSX n’est pas aussi avancé que celui d’Unixen capable de le faire facilement et systématiquement.

R1: http://hg.adium.im/adium-1.4/ fichier / 00d944a3ef16 / version

Cela a finalement fonctionné dans mon propre projet (qui se trouve être dans Xcode). L'ajout de ces 3 scripts à votre phase de construction créera automatiquement une image de disque agréable et soignée pour votre produit. Tout ce que vous avez à faire est de construire votre projet et le DMG attendra dans votre dossier de produits.

Script 1 (Créer une image de disque temporaire):

#!/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 (script de définition des propriétés de la fenêtre):

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

La mesure ci-dessus pour la fenêtre fonctionne pour mon projet, en raison de la taille de ma photo d'arrière-plan et de la résolution de mon icône; vous devrez peut-être modifier ces valeurs pour votre propre projet.

Script 3 (Créer le script final de l'image disque):

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

Assurez-vous que les fichiers d’image que vous utilisez se trouvent dans le répertoire $ PROJECT_DIR / $ PROJECT_NAME /!

Ces réponses sont beaucoup trop compliquées et les temps ont changé. Ce qui suit fonctionne parfaitement sur 10.9, les permissions sont correctes et l’air agréable.

Créer un fichier DMG en lecture seule à partir d'un répertoire

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

Créer un fichier DMG en lecture seule avec une icône (type .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

Si quelque chose d'autre devait se produire, la chose la plus simple à faire est de créer une copie temporaire de SRC_DIR et de l'appliquer avant de créer un fichier DMG.

Je viens d'écrire un nouvel utilitaire (convivial) en ligne de commande pour cela. Il ne repose pas sur Finder / AppleScript, ni sur aucune des API Alias ??Manager (dépréciées), et il est facile à configurer et à utiliser.

Quoi qu'il en soit, toute personne intéressée peut la trouver sur PyPi ; la documentation est disponible sur Read The Docs .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top