Frage

Ich muss ein schönes Installationsprogramm für eine Mac-Anwendung erstellen.Ich möchte, dass es ein Disk-Image (DMG) mit vordefinierter Größe, Layout und Hintergrundbild ist.

Ich muss dies programmgesteuert in einem Skript tun, um es in ein bestehendes Build-System zu integrieren (eigentlich eher ein Pack-System, da es nur Installationsprogramme erstellt).Die Builds werden separat durchgeführt.

Ich habe die DMG-Erstellung bereits mit „hdiutil“ durchgeführt. Was ich noch nicht herausgefunden habe, ist, wie man ein Symbollayout erstellt und eine Hintergrund-Bitmap angibt.

War es hilfreich?

Lösung

Nach vielen Forschung, ich habe mit dieser Antwort kommen, und ich bin es hiermit hier als Antwort auf meine eigene Frage zu stellen, als Referenz:

  1. Stellen Sie sicher, dass "Zugriff für Hilfsgeräte aktivieren" in den Systemeinstellungen >> Universal Access geprüft. Es ist erforderlich, für das Applescript zu arbeiten. Sie können nach dieser Änderung neu zu starten (es nicht anders 10.4 auf Mac OS X Server funktioniert).

  2. Erstellen Sie eine R / W DMG. Es muss größer sein als das Ergebnis sein wird. In diesem Beispiel enthält die Bash-Variable „Größe“ die Größe in Kb und den Inhalt des Ordners in der „Quelle“ bash Variable wird in die DMG kopiert werden:

    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. das Disk-Image montieren, und speichern Sie die Gerätenamen (möglicherweise Schlaf für ein paar Sekunden nach dieser Operation verwendet werden soll):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Speichern Sie das Hintergrundbild (im PNG-Format) in einem Ordner ".background" in der DMG genannt, und speichern Sie den Namen in dem "backgroundPictureName" Variable.

  5. Verwenden Sie Apple die visuellen Stile festlegen (Name von .app in bash Variablen „application“ sein müssen, Variablen für die anderen Eigenschaften verwenden, je nach Bedarf):

    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 die DMG durch Berechtigungen richtig einstellen, Komprimieren und loslassen:

    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 
    

Auf Snow Leopard, die über Applescript wird das Symbol Position nicht richtig eingestellt - es scheint ein Snow Leopard Bug zu sein. Eine Abhilfe ist einfach anrufen öffnen / schließen, nachdem die Symbole Einstellung, das heißt:.

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

Andere Tipps

Es gibt ein kleines Bash-Skript namens create-dmg , die mit benutzerdefinierten Hintergründe Phantasie DMGs baut, benutzerdefinierte Symbolpositioniervorrichtung und Volume-Name.

Ich habe es viele Jahre gebaut vor für die Firma, die ich zu der Zeit lief; es lebt von anderen Menschen Beitrag seitdem und arbeitet wie verlautet gut.

Es gibt auch Knoten-appdmg , die wie eine modernere und aktive Anstrengung sieht basierend auf Knoten. js; überprüfen Sie es auch aus.

Sie es nicht gehen. Als Entwickler langfristig Mac, kann ich Ihnen versichern, ist keine Lösung wirklich gut funktioniert. Ich habe versucht, so viele Lösungen, aber sie sind alle nicht so gut. Ich denke, das Problem ist, dass Apple nicht wirklich das Metadatenformat für die notwendigen Daten dokumentieren.

Hier ist, wie ich tue es für eine lange Zeit, sehr erfolgreich:

  1. Erstellen Sie eine neue DMG, beschreibbar (!), Groß genug, um die erwarteten binären und zusätzliche Dateien wie readme zu halten (Sparse funktionieren kann).

  2. die DMG montieren und ein Layout manuell in Finder geben oder mit dem, was Tool Anzügen für Sie, das zu tun (FileStorm Link am Ende für ein gutes Werkzeug sehen). Das Hintergrundbild ist in der Regel ein Bild, das wir in einem versteckten Ordner stellen ( „.something“) auf der DMG. Legen Sie eine Kopie Ihrer App gibt (eine Version, auch veraltete ein tun wird). Kopieren Sie andere Dateien (Aliase, Readme, etc.) Sie wollen es wieder tun werden veraltete Versionen gut. Stellen Sie sicher, Symbole haben die richtigen Größen und Positionen (IOW, Layout, um die DMG so, wie Sie es wollen sein).

  3. aushängen wieder die DMG, sollten alle Einstellungen nun gespeichert werden.

  4. Schreiben Sie einen DMG-Skript erstellen, die wie folgt funktioniert:

    • Es kopiert die DMG, so das Original wird nie wieder berührt.
    • Es bringt die Kopie.
    • Sie ersetzt alle Dateien mit der aktuellsten denjenigen (z neuestem App nach dem Bauprozess). Sie können einfach mit mv oder dito für die auf der Kommandozeile. Beachten Sie, wenn Sie eine Datei wie das ersetzen, wird das Symbol gleich bleiben, bleiben die Position die gleiche, alles, aber die Datei (oder das Verzeichnis) Inhalt bleibt gleich (zumindest mit dito, die wir in der Regel für diese Aufgabe verwenden) . Sie können natürlich auch mit einem anderen das Hintergrundbild ersetzen (nur sicherstellen, dass es die gleichen Abmessungen hat).
    • Nach dem Ersetzen von Dateien, machen das Skript erneut die DMG Kopie aushängen.
    • Schließlich rufen hdiutil die beschreibbar zu konvertieren, zu einem komprimierten (und so nicht beschreibbar) DMG.

Dieses Verfahren kann nicht optimal klingen, aber glauben Sie mir, es funktioniert wirklich gut in der Praxis. Sie können den Original-DMG (DMG-Vorlage) auch unter Versionskontrolle (z SVN) setzen, wenn Sie also schon einmal versehentlich ändern / zerstören, können Sie einfach zu einer Revision zurück, wo es noch in Ordnung war. Sie können die DMG-Vorlage zu Ihrem Xcode-Projekt hinzufügen, zusammen mit allen anderen Dateien, die auf die DMG gehören (readme, URL-Datei, Hintergrundbild), die alle unter Kontrolle Version und erstellen Sie dann ein Ziel (zB externes Ziel mit dem Namen „Create DMG“) und es läuft die DMG-Skript von oben und Ihr altes Hauptziel als abhängiges Ziel hinzuzufügen. Sie Dateien im Xcode Baum zugreifen können $ {SRCROOT} im Skript (ist immer die Quelle Wurzel Ihres Produkts) verwenden und Sie können die Produkte zugreifen bauen von $ {BUILT_PRODUCTS_DIR} verwenden (ist immer das Verzeichnis, in dem Xcode die Build-Ergebnisse erzeugt) .

Ergebnis: Eigentlich kann Xcode die DMG am Ende des Build erzeugen. Ein DMG, die bereit zu lösen ist. Sie können nicht nur einen Relase DMG recht einfach auf diese Weise erstellen, können Sie tatsächlich so in einem automatisierten Prozess zu tun (auf einem Headless-Server, wenn Sie möchten), mit xcodebuild von der Kommandozeile (automatisiertes Nightly Builds zum Beispiel).

In Bezug auf die anfängliche Layout der Vorlage, FileStorm ein gutes Werkzeug ist, es zu tun. Es ist kommerziell, aber sehr leistungsfähig und einfach zu bedienen. Die normale Version ist weniger als $ 20, also ist es wirklich erschwinglich. Vielleicht kann man FileStorm automatisiert eine DMG (zum Beispiel via Applescript) zu schaffen, nie versucht, das, aber sobald Sie die perfekte Vorlage DMG gefunden haben, ist es wirklich einfach es für jede Veröffentlichung zu aktualisieren.

Bringing diese Frage auf dem neuesten Stand, indem Sie diese Antwort zu geben.

appdmg ist ein einfaches, leicht zu bedienende Open-Source-Befehlszeilenprogramm, die dmg-Dateien aus einer einfachen json Spezifikation erstellt. Werfen Sie einen Blick auf die readme auf der offiziellen Website:

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

Schnell Beispiel:

  1. Installieren appdmg

    npm install -g appdmg
    
  2. Schreiben Sie eine JSON-Datei (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. Ausführen Programm

    appdmg spec.json test.dmg
    

(Haftungsausschluss. Ich bin der Schöpfer von appdmg)

Für diejenigen von Ihnen, die an diesem Thema interessiert sind, sollte ich erwähnen, wie ich die DMG erstellen:

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

Dabei steht

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

Meine app, DropDMG , ist eine einfache Möglichkeit, Disk-Images mit Hintergrundbildern, Icon-Layouts zu erstellen , kundenspezifische Volumen Symbole und Softwarelizenzvereinbarungen. Es kann über das „DropDMG“ Befehlszeilenprogramm oder Apple von einem Bausystem gesteuert werden. Falls gewünscht, können die Bild- und Lizenz RTF-Dateien unter dem Versionskontrollsystem gespeichert werden.

Ich fand diesen großen Mac App den Prozess zu automatisieren - http://www.araelium.com/dmgcanvas/ Sie müssen einen Blick haben, wenn Sie dmg Installationsprogramm für Ihren Mac App erstellen

Wenn Sie benutzerdefiniertes Volume-Symbol setzen dann unter Befehl

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

Jetzt create read / write dmg

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

Für eine gut aussehende DMG erstellen, können Sie jetzt nur noch einige gut geschrieben öffentlich zugängliche Quellen verwenden:

.DS_Store Dateien speichert Windows-Einstellungen in Mac. Windows-Einstellungen umfassen das Icons Layout, das Fenster Hintergrund, um die Größe des Fensters, usw. Die .DS_Store Datei bei der Erstellung der Fenster für angebracht Bilder benötigt wird, um die Anordnung von Dateien und den Windows-Hintergrund zu erhalten.

Wenn Sie .DS_Store-Datei erstellt haben, können Sie kopieren Sie es einfach an Ihre erstellten Installer (DMG).

ich auch in Not-Befehlszeile Ansatz der Verwendung der Verpackung und dmg creation „programmatisch in einem Skript“ zu tun. Die beste Antwort, die ich bisher gefunden ist von Adium Projekt‘Releasegebäuderahmen (siehe R1). Es gibt ein eigenes Skript (AdiumApplescriptRunner), damit Sie OSX Windowsserver GUI Interaktion vermeiden. „Osascript applescript.scpt“ Ansatz erforderlich, dass Sie als Builder anmelden und die dmg Schaffung von einer Befehlszeile VT100-Sitzung ausgeführt.

OSX Paket-Management-System ist nicht so weit fortgeschritten, im Vergleich zu anderen Unixen, die diese Aufgabe leicht und systematisch tun können.

R1: http://hg.adium.im/adium-1.4/ file / 00d944a3ef16 / Veröffentlichung

Ich habe endlich diese Arbeit in meinem eigenen Projekt (die in Xcode sein geschieht). Addiert man diese 3-Scripts in Ihre Erstellungsphase wird automatisch ein Disk Image für Ihr Produkt erstellen, die nett und ordentlich ist. Alles, was Sie tun müssen, ist Ihr Projekt erstellen und die DMG in Ihren Produkten Ordner warten.

Script 1 (Create Temp Disk Image):

#!/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 (Set Fenstereigenschaften Script):

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

Die obige Messung für die Fenster Arbeit für mein Projekt speziell aufgrund der Größe meines Hintergrund pic und Symbol Auflösung; Sie müssen diese Werte für Ihr eigenes Projekt ändern.

Script 3 (Make Schluss Disk Image Script):

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

Stellen Sie sicher, dass die Bilddateien, die Sie verwenden, sind in dem $ project_dir / $ PROJECT_NAME / Verzeichnis!

Diese Antworten sind viel zu kompliziert und die Zeiten geändert haben. Folgende Arbeiten auf 10,9 ganz gut, Berechtigungen korrekt sind und es sieht gut aus.

Erstellen Sie einen Nur-Lese-DMG aus einem Verzeichnis

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

Erstellen Nur-Lese-DMG mit einem Symbol (.icns Typ)

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

Wenn irgendetwas anderes passieren muss, diese einfachste Sache ist, eine temporäre Kopie der SRC_DIR zu machen und die Änderungen an, die vor einem DMG zu schaffen.

Ich habe gerade ein neues (freundliches) Befehlszeilenprogramm geschrieben, um dies zu tun.Es ist nicht auf Finder/AppleScript oder eine der (veralteten) Alias ​​Manager-APIs angewiesen und lässt sich einfach konfigurieren und verwenden.

Wie auch immer, jeder, der Interesse hat, kann es tun finde es auf PyPi;Die Dokumentation ist verfügbar auf Read The Docs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top