Wie erstelle ich mit Befehlszeilentools eine gut aussehende DMG für Mac OS X?

212

Ich muss ein nettes Installationsprogramm für eine Mac-Anwendung erstellen. Ich möchte, dass es sich um ein Disk Image (DMG) mit einer vordefinierten Größe, einem vordefinierten Layout und einem Hintergrundbild handelt.

Ich muss dies programmgesteuert in einem Skript tun, um in ein vorhandenes Build-System integriert zu werden (eher ein Pack-System, da nur Installer erstellt werden. Die Builds werden separat ausgefü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.

Ludvig A Norin
quelle
1
Ist das nicht etwas für Ask Different?
Lenar Hoyt

Antworten:

199

Nach vielen Recherchen habe ich diese Antwort gefunden und füge sie hiermit als Antwort auf meine eigene Frage als Referenz ein:

  1. Stellen Sie sicher, dass unter "Systemeinstellungen >> Universeller Zugriff" die Option "Zugriff für unterstützende Geräte aktivieren" aktiviert ist. Damit AppleScript funktioniert, muss es funktionieren. Möglicherweise müssen Sie nach dieser Änderung neu starten (ansonsten funktioniert es unter Mac OS X Server 10.4 nicht).

  2. Erstellen Sie eine R / W-DMG. Es muss größer sein als das Ergebnis. In diesem Beispiel enthält die Bash-Variable "size" die Größe in KB und der Inhalt des Ordners in der Bash-Variablen "source" wird in die DMG kopiert:

    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. Hängen Sie das Disk-Image ein und speichern Sie den Gerätenamen (nach diesem Vorgang möchten Sie möglicherweise einige Sekunden lang den Ruhezustand verwenden):

    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 mit dem Namen ".background" in der DMG und speichern Sie seinen Namen in der Variablen "backgroundPictureName".

  5. Verwenden Sie AppleScript, um die visuellen Stile festzulegen (der Name von .app muss in der Bash-Variablen "applicationName" enthalten sein, verwenden Sie nach Bedarf Variablen für die anderen Eigenschaften):

    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. Schließen Sie die DMG ab, indem Sie die Berechtigungen richtig einstellen, komprimieren und freigeben:

    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 
    

Bei Snow Leopard setzt das obige Applescript die Symbolposition nicht richtig - es scheint sich um einen Snow Leopard-Fehler zu handeln. Eine Problemumgehung besteht darin, nach dem Festlegen der Symbole einfach close / open aufzurufen, dh:

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
Ludvig A Norin
quelle
1
Ausgezeichnet. Zwei Fragen dazu: 1. Sie empfehlen, sleepnachdem Sie das Bild aufgeschüttet haben. Wie lange? Ist es nicht möglich, deterministisch auf den Abschluss des Prozesses zu warten? Gleiches gilt für delay 5Ihr AppleScript. Ich bin immer vorsichtig mit solchen willkürlichen Wartezeiten, da ich einige sehr schlechte Erfahrungen mit ihnen gemacht habe. 2. In Schritt 6 rufen Sie synczweimal an - warum?
Konrad Rudolph
Ich habe keine Möglichkeit gefunden, deterministisch auf den Abschluss des Befehls "Update ohne Registrierung von Anwendungen" zu warten. Ich bin nicht sicher, ob nach "hdiutil attach" Schlaf benötigt wird. Sie müssen die Dokumentation überprüfen (man hdiutil). Die Synchronisierung sollte nur einmal aufgerufen werden müssen. Ich mache sie aus alten Gewohnheiten seit den guten alten SunOS-Tagen zweimal.
Ludvig A. Norin
1
Es ermöglicht Applescript, Maus- und Tastatureingaben und eine Reihe anderer Dinge zu simulieren.
Ludvig A. Norin
1
Wenn das Skript so lange hängt, bis das Zeitlimit in der Zeile "Aktualisieren ohne Registrierung von Anwendungen" abgelaufen ist, wurde Schritt 1 nicht ausgeführt (oder rückgängig gemacht). Ich habe das gerade auf die harte Tour herausgefunden.
Jay Maynard K5ZC
Ich glaube, ich habe einen kleinen Fehler gefunden - es gibt einen Auswurf im AppleScript, der ausgeführt wird, bevor Sie versuchen, chmod auszuführen. chmod schlägt fehl, da die Festplatte jetzt ausgeworfen wird.
Trejkaz
56

Es gibt ein kleines Bash-Skript namens create-dmg , das ausgefallene DMGs mit benutzerdefinierten Hintergründen, benutzerdefinierter Symbolpositionierung und Datenträgernamen erstellt.

Ich habe es vor vielen Jahren für die Firma gebaut, die ich damals geführt habe. es überlebt seitdem den Beitrag anderer Menschen und funktioniert Berichten zufolge gut.

Es gibt auch Node-Appdmg, das wie eine modernere und aktivere Anstrengung aussieht, die auf Node.js basiert. Probieren Sie es auch aus.

Andrey Tarantsov
quelle
7
Der Link zu Ihrem Bash-Skript ist unterbrochen. Können Sie es auf github.com zusammenfassen? Danke
dquimper
create-dmg positioniert das Symbol NICHT gut. Wenn Sie diese Funktion benötigen, verwenden Sie sie nicht.
Laike9m
1
@ laike9m Es ist mehr als 5 Jahre her, seit ich es das letzte Mal berührt habe. Ich halte DMGs nicht mehr für den besten Weg, um Mac-Software zu vertreiben. Es überlebt also mit Beiträgen anderer - hoffentlich wird auch jemand das Problem mit den Symbolen herausfinden.
Andrey Tarantsov
3
@Zmey Nun, als Benutzer bevorzuge ich bei weitem Zip-Dateien. Bonuspunkte für das automatische Kopieren, /Applicationswenn die App erkennt, dass sie ausgeführt wird ~/Downloads. Siehe auch diesen alten Artikel von John Gruber .
Andrey Tarantsov
37

Geh nicht dorthin. Als langjähriger Mac-Entwickler kann ich Ihnen versichern, dass keine Lösung wirklich gut funktioniert. Ich habe so viele Lösungen ausprobiert, aber sie sind alle nicht so gut. Ich denke, das Problem ist, dass Apple das Metadatenformat für die erforderlichen Daten nicht wirklich dokumentiert.

So mache ich das schon lange, sehr erfolgreich:

  1. Erstellen Sie eine neue DMG, beschreibbar (!), Die groß genug ist, um die erwarteten Binär- und Zusatzdateien wie Readme zu speichern (spärlich könnte funktionieren).

  2. Hängen Sie die DMG ein und geben Sie ihr manuell ein Layout im Finder oder mit den für Sie geeigneten Tools (siehe FileStorm-Link unten für ein gutes Tool). Das Hintergrundbild ist normalerweise ein Bild, das wir in einem versteckten Ordner (".something") in der DMG ablegen. Legen Sie dort eine Kopie Ihrer App ab (jede Version, auch eine veraltete, reicht aus). Kopieren Sie andere Dateien (Aliase, Readme-Dateien usw.), die Sie möchten. Auch hier sind veraltete Versionen ausreichend. Stellen Sie sicher, dass die Symbole die richtigen Größen und Positionen haben (IOW, gestalten Sie das DMG so, wie Sie es möchten).

  3. Hängen Sie die DMG wieder aus, alle Einstellungen sollten jetzt gespeichert sein.

  4. Schreiben Sie ein DMG-Erstellungsskript, das wie folgt funktioniert:

    • Es kopiert die DMG, so dass die ursprüngliche nie wieder berührt wird.
    • Es montiert die Kopie.
    • Es ersetzt alle Dateien durch die aktuellsten (z. B. die neueste App nach dem Erstellen). Sie können dafür einfach mv oder ditto in der Befehlszeile verwenden. Beachten Sie, wenn Sie eine solche Datei ersetzen, bleibt das Symbol gleich, die Position bleibt gleich, alles außer dem Inhalt der Datei (oder des Verzeichnisses) bleibt gleich (zumindest mit ditto, das wir normalerweise für diese Aufgabe verwenden). . Sie können das Hintergrundbild natürlich auch durch ein anderes ersetzen (stellen Sie nur sicher, dass es die gleichen Abmessungen hat).
    • Lassen Sie das Skript nach dem Ersetzen der Dateien die DMG-Kopie erneut aushängen.
    • Rufen Sie schließlich hdiutil auf, um das beschreibbare DMG in ein komprimiertes (und nicht beschreibbares) DMG zu konvertieren.

Diese Methode klingt vielleicht nicht optimal, aber glauben Sie mir, sie funktioniert in der Praxis sehr gut. Sie können die ursprüngliche DMG (DMG-Vorlage) sogar unter Versionskontrolle (z. B. SVN) stellen. Wenn Sie sie also versehentlich ändern / zerstören, können Sie einfach zu einer Revision zurückkehren, in der sie noch in Ordnung war. Sie können die DMG-Vorlage zusammen mit allen anderen Dateien, die zur DMG gehören (Readme, URL-Datei, Hintergrundbild), unter Versionskontrolle zu Ihrem Xcode-Projekt hinzufügen und dann ein Ziel erstellen (z. B. ein externes Ziel mit dem Namen "DMG erstellen"). Führen Sie dort das oben genannte DMG-Skript aus und fügen Sie Ihr altes Hauptziel als abhängiges Ziel hinzu. Sie können mit $ {SRCROOT} im Skript auf Dateien im Xcode-Baum zugreifen (ist immer das Quellstammverzeichnis Ihres Produkts) und Sie können mit $ {BUILT_PRODUCTS_DIR} auf Build-Produkte zugreifen (dies ist immer das Verzeichnis, in dem Xcode die Build-Ergebnisse erstellt). .

Ergebnis: Tatsächlich kann Xcode die DMG am Ende des Builds erzeugen. Eine DMG, die zur Veröffentlichung bereit ist. Auf diese Weise können Sie nicht nur ganz einfach ein Relase-DMG erstellen, sondern dies auch in einem automatisierten Prozess (auf einem Headless-Server, wenn Sie möchten) mithilfe von xcodebuild über die Befehlszeile (z. B. automatisierte nächtliche Builds).

In Bezug auf das ursprüngliche Layout der Vorlage ist FileStorm ein gutes Werkzeug dafür. Es ist kommerziell, aber sehr leistungsfähig und einfach zu bedienen. Die normale Version kostet weniger als 20 US-Dollar und ist daher sehr erschwinglich. Vielleicht kann man FileStorm automatisieren, um eine DMG zu erstellen (z. B. über AppleScript), das hat man nie versucht, aber wenn man die perfekte Vorlagen-DMG gefunden hat, ist es wirklich einfach, sie für jede Version zu aktualisieren.

Mecki
quelle
3
Ich habe die Idee, dies auf diese Weise zu tun, aus mehreren Gründen bereits verworfen. Hier sind zwei davon: Der Inhalt der Installationsprogramme variiert je nach Produkt, und wir möchten uns nur auf Software verlassen, die auf den Packmaschinen und Skripten installiert ist - eine einzige, minimale, manuelle Routine zum Hinzufügen neuer Produkte.
Ludvig A. Norin
Dies ist das gleiche Szenario wie wir. Wir haben mehr als ein Dutzend Produkte; Jeder hat eine ganz andere DMG. Das Erstellen einer Vorlagen-DMG pro Produkt ist eine einmalige Aufgabe und dauert einige Minuten. Und was meinst du mit "Installer"? PKG / MPKG-Installationspakete?
Mecki
Es ist nicht das gleiche Szenario. Wir fügen häufig kurzfristig Produkte hinzu. Die minimale manuelle Routine bedeutet, ein Skript auszuführen, das dem Produkt einen Namen und einige andere Attribute gibt. Es gibt auch darüber hinaus Gründe, die uns dazu bewogen haben, diese Art von Lösung nicht zu verwenden.
Ludvig A. Norin
Wir haben den Packprozess vom Buildprozess getrennt, da er von verschiedenen Personen zu unterschiedlichen Zeiten ausgeführt wird. Der Packprozess erstellt Installationsprogramme für Windows, Windows CE, Symbian, AIX, Linux und Solaris.
Ludvig A. Norin
Sie beziehen sich wahrscheinlich auf hdiutil, nicht auf hdutil.
Ivan Vučica
25

Bringen Sie diese Frage auf den neuesten Stand, indem Sie diese Antwort geben.

appdmgist ein einfaches, benutzerfreundliches Open-Source-Befehlszeilenprogramm, das dmg-Dateien aus einer einfachen json-Spezifikation erstellt. Schauen Sie sich die Readme-Datei auf der offiziellen Website an:

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

Kurzes Beispiel:

  1. Installieren Sie 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. Programm ausführen

    appdmg spec.json test.dmg
    

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

Linus Unnebäck
quelle
3
einfach und effektiv. Der einzige Nachteil ist, dass npm installiert werden muss
Jack James
@Creator: Kannst du es bitte so machen, dass dieses GUI angeboten wird, ohne dass du es ziehen und ablegen musst? s.sudre.free.fr/Software/Packages/about.html
Wenn sich die .app-Datei nicht im selben Ordner wie die json-Datei befindet, funktioniert dies nicht. Es wird der Fehler "Datei nicht gefunden" ausgegeben, wenn Sie einen relativen Pfad in "Pfad" angeben
Joey
@Joey, könnten Sie ein Problem im Github-Repository öffnen, wenn es bei Ihnen nicht funktioniert?
Linus Unnebäck
@Joey: Es ist nicht erforderlich, im selben Ordner zu sein, ich habe Hintergrund, App alle in unterschiedlichen Pfad, nur relative Pfade übergeben als ../../../ABC
Anoop Vaidya
22

Für diejenigen unter Ihnen, die sich für dieses Thema interessieren, sollte ich erwähnen, wie ich die DMG erstelle:

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

wo

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
Ludvig A. Norin
quelle
1
Das ist in Ordnung, aber es geht nicht auf den tatsächlichen Bedarf ein (Hintergrundbild, Positionierung von Elementen im Ordner usw.)
Tom Bogle
DMG erstellt, aber ich muss mein Skript (.sh) wieder mit CMD ausführen. Ich muss das sh automatisch ausführen, nachdem
ich
13

Meine App DropDMG ist eine einfache Möglichkeit, Disk-Images mit Hintergrundbildern , Symbollayouts , benutzerdefinierten Volumensymbolen und Softwarelizenzvereinbarungen zu erstellen. Es kann von einem Build-System über das Befehlszeilentool "dropdmg" oder AppleScript gesteuert werden. Auf Wunsch können die Bild- und Lizenz-RTF-Dateien unter Ihrem Versionskontrollsystem gespeichert werden.

Michael Tsai
quelle
3
Mein Team hat dies wunderbar und automatisch auf einem Jenkins CI-Build-Server mit Hintergrund ausgeführt und auf den Alias ​​"Anwendungen" gezogen. Führen Sie DropDMG aus, gehen Sie nicht zu Fuß, um Disk-Images zu erstellen.
Paul Collins
Gute App, ich werde sie kaufen, nachdem meine Testversion abgelaufen ist.
Kilik52
Sieht gut aus, scheint aber keine Option zum Ändern der Fenstergröße zu haben.
Avi
@avi DropDMG Größen automatisch das Fenster zu dem Hintergrundbild , dass Sie eingestellt (oder Einfügung in dieses Bild , wenn gewünscht).
Michael Tsai
Vielen Dank! Ist es möglich, die Größe ohne Hintergrundbild zu ändern?
Avi
6

Ich habe diese großartige Mac-App gefunden, um den Prozess zu automatisieren - http://www.araelium.com/dmgcanvas/ Sie müssen einen Blick darauf werfen, ob Sie ein dmg-Installationsprogramm für Ihre Mac-App erstellen

Saurabh
quelle
1
Beachten Sie, dass dies kein kostenloses Programm ist und daher nicht für viele Umgebungen geeignet ist.
Jay Maynard K5ZC
5

Um eine gut aussehende DMG zu erstellen, können Sie jetzt nur einige gut geschriebene Open Source verwenden:

Anni S.
quelle
Könnte sein, dass sie es bewegt haben. Sie können create-dmg und node-appdmg verwenden. Ich benutze create-dmg. Das ist gut.
Anni S
@ PamelaCook-LightBeCorp Falls Sie noch interessiert sind. Der Link zu dmgbuild wurde behoben.
SubOptimal
4

Wenn Sie ein benutzerdefiniertes Volume-Symbol festlegen möchten, verwenden Sie den folgenden 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

Erstellen Sie nun Lese- / Schreib-DMG

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
Parag Bafna
quelle
Können Sie erklären, was der "Ihr Weg" hier bedeutet? Kann ich eine beliebige Symboldatei auf der Festplatte verwenden und SetFile würde sie kopieren oder müsste ich eine Datei verwenden, die sich in .dmg befindet? Ich habe nur einen Mac, daher ist es schwierig zu testen, ob auf anderen Computern etwas funktioniert.
Milan Babuškov
"Ihr Pfad" ist DMG-Name. (/ Volumes / dmgName)
Parag Bafna
Sie sollten die icns-Datei kopieren. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
Parag Bafna
4

Ich habe das endlich in meinem eigenen Projekt zum Laufen gebracht (das zufällig in Xcode ist). Durch Hinzufügen dieser 3 Skripte zu Ihrer Erstellungsphase wird automatisch ein Disk Image für Ihr Produkt erstellt, das schön und ordentlich ist. Alles was Sie tun müssen, ist Ihr Projekt zu erstellen und die DMG wartet in Ihrem Produktordner.

Skript 1 (temporäres Disk-Image erstellen):

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

Skript 2 (Skript zum Festlegen von Fenstereigenschaften):

#!/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 das Fenster funktioniert für mein Projekt speziell aufgrund der Größe meines Hintergrundbilds und der Symbolauflösung. Möglicherweise müssen Sie diese Werte für Ihr eigenes Projekt ändern.

Skript 3 (Make Final Disk Image Script erstellen):

#!/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 sich die von Ihnen verwendeten Bilddateien im Verzeichnis $ PROJECT_DIR / $ PROJECT_NAME / befinden!

P.M.
quelle
Es wird ein leeres Disk-Image in meinem Projekt erstellt. Irgendein Vorschlag.
ManiaChamp
Der Shell-Skript-Teil funktioniert nur, aber wie kann ich ein Apple-Skript mit Shell-Skript in RunScript in der Build-Phase hinzufügen? Es wird ein Fehler angezeigt. Jede Apple-Skript-Anweisung ist ein Symbol, das nicht gefunden wurde.
ManiaChamp
2

.DS_Store-Dateien speichern Windows-Einstellungen auf dem Mac. Zu den Windows-Einstellungen gehören das Symbollayout, der Fensterhintergrund, die Größe des Fensters usw. Die Datei .DS_Store wird zum Erstellen des Fensters für bereitgestellte Bilder benötigt, um die Anordnung der Dateien und den Windows-Hintergrund beizubehalten.

Sobald Sie die .DS_Store-Datei erstellt haben, können Sie sie einfach in Ihr erstelltes Installationsprogramm (DMG) kopieren.

hor10zs
quelle
Fügen Sie dem dmg jedoch zuerst ein Hintergrundbild hinzu, indem Sie es wie .background.png benennen und dann mit Cmd-J das (!) Bild zum Hintergrund hinzufügen.
Gijs
2

Ich brauche auch einen Befehlszeilenansatz, um das Packen und die Erstellung von dmg "programmgesteuert in einem Skript" durchzuführen. Die beste Antwort, die ich bisher gefunden habe, stammt aus dem Release Building Framework des Adium-Projekts (siehe R1). Es gibt ein benutzerdefiniertes Skript (AdiumApplescriptRunner), mit dem Sie die Interaktion mit der OSX WindowsServer-Benutzeroberfläche vermeiden können. Für den Ansatz "osascript applescript.scpt" müssen Sie sich als Builder anmelden und die dmg-Erstellung über eine Befehlszeilen-vt100-Sitzung ausführen.

Das OSX-Paketverwaltungssystem ist im Vergleich zu anderen Unixen, die diese Aufgabe einfach und systematisch ausführen können, nicht so fortschrittlich.

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

TJ Yang
quelle
2

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

Jeder, der interessiert ist, kann es auf PyPi finden ; Die Dokumentation finden Sie unter Read The Docs .

Alastair
quelle
1

Diese Antworten sind viel zu kompliziert und die Zeiten haben sich geändert. Das Folgende funktioniert gut mit 10.9, die Berechtigungen sind korrekt und es sieht gut aus.

Erstellen Sie eine schreibgeschützte 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 Sie eine schreibgeschützte DMG mit einem Symbol (Typ .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

Wenn etwas anderes passieren muss, ist es am einfachsten, eine temporäre Kopie des SRC_DIR zu erstellen und Änderungen daran vorzunehmen, bevor Sie eine DMG erstellen.

user246672
quelle
Diese Antwort fügt nichts zu dem hinzu, was zuvor geschrieben wurde, und sie beantwortet auch nicht die ursprüngliche Frage (es geht nicht nur darum, ein Symbol in das dmg einzufügen oder es zu signieren; bei der Frage geht es darum, Grafiken hinzuzufügen und Symbole programmgesteuert zu positionieren a dmg).
Ludvig A. Norin