Wie erstelle ich mithilfe von Befehlszeilentools ein gut aussehendes DMG für Mac OS X?

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

Ich muss dies programmatisch in einem Skript machen, um in ein existierendes Build-System integriert zu werden (mehr wirklich ein Paketsystem, da es nur Installer erzeugt. Die Builds werden separat gemacht).

Ich habe bereits die DMG-Erstellung mit "hdiutil" gemacht, was ich noch nicht herausgefunden habe ist, wie man ein Icon-Layout erstellt und ein Hintergrund-Bitmap spezifiziert.

0
hinzugefügt bearbeitet
Ansichten: 28
hinzugefügt der Autor Prof. Falken, Quelle
Ist das nicht etwas für Ask Different?
hinzugefügt der Autor Lenar Hoyt, Quelle

14 Antworten

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 //.VolumeIcon.icns

Erstellen Sie nun dmg lesen/schreiben

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
0
hinzugefügt
"Ihr Weg" ist DMG-Name. (/ Volumen/dmgName)
hinzugefügt der Autor Parag Bafna, Quelle
Sie sollten die ICNS-Datei kopieren. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
hinzugefügt der Autor Parag Bafna, Quelle
Kannst du erklären, was der "dein Weg" hier bedeutet? Kann ich irgendeine Symboldatei auf dem Datenträger verwenden, und SetFile würde sie kopieren, oder müsste ich eine Datei verwenden, die sich in .dmg befindet? Ich habe nur einen Mac, also ist es schwer zu testen, ob das auf anderen Rechnern funktioniert.
hinzugefügt der Autor Milan Babuškov, Quelle

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

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

woher

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
0
hinzugefügt
Das ist in Ordnung, aber es adressiert nicht den tatsächlichen Bedarf (Hintergrundbild, Positionierung von Elementen im Ordner usw.)
hinzugefügt der Autor Tom Bogle, Quelle

Nach vielen Nachforschungen bin ich auf diese Antwort gekommen, und ich stelle sie hier als Antwort auf meine eigene Frage, als Referenz:

  1. Make sure that "Enable access for assistive devices" is checked in System Preferences>>Universal Access. It is required for the AppleScript to work. You may have to reboot after this change (it doesn't work otherwise on Mac OS X Server 10.4).

  2. Create a R/W DMG. It must be larger than the result will be. In this example, the bash variable "size" contains the size in Kb and the contents of the folder in the "source" bash variable will be copied into the 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. Mount the disk image, and store the device name (you might want to use sleep for a few seconds after this operation):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Store the background picture (in PNG format) in a folder called ".background" in the DMG, and store its name in the "backgroundPictureName" variable.

  5. Use AppleScript to set the visual styles (name of .app must be in bash variable "applicationName", use variables for the other properties as needed):

    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 the DMG by setting permissions properly, compressing and releasing it:

    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 wird das obige AppleScript die Icon-Position nicht korrekt einstellen - es scheint sich um einen Snow Leopard Bug zu handeln. Eine Problemumgehung besteht darin, nach dem Festlegen der Symbole einfach clos/open aufzurufen.

..
set position of item "'${applicationName}'" of container window to {100, 100}
set position of item "Applications" of container window to {375, 100}
close
open
0
hinzugefügt
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, weil der Datenträger jetzt ausgeworfen wird.
hinzugefügt der Autor Trejkaz, Quelle
Es erlaubt AppleScript, Maus- und Tastatureingabe und eine Menge anderer Dinge zu simulieren.
hinzugefügt der Autor Ludvig A. Norin, Quelle
Das Entfernen der Schreibberechtigungen für den Quellordner war in einer der früheren Versionen von hdiutil erforderlich. In diesem Artikel wird davon ausgegangen, dass die Befehle als root ausgeführt werden, die für alle anderen Teile möglicherweise benötigt werden oder auch nicht. Die aktuelle Version von hdiutil kümmert sich nicht um die Schreibrechte für den Quellordner.
hinzugefügt der Autor Ludvig A. Norin, Quelle
Ich habe keine Möglichkeit gefunden, deterministisch auf den Abschluss des Befehls 'Update ohne Registrierung von Anwendungen' zu warten. Ich bin mir nicht sicher, ob nach "hdiutil attach" noch Schlaf benötigt wird, Sie müssen die Dokumentation (man hdiutil) überprüfen. Sync sollte nur einmal aufgerufen werden, ich mache es zweimal aus alter Gewohnheit seit den guten alten SunOS-Tagen.
hinzugefügt der Autor Ludvig A. Norin, Quelle
github.com/LinusU/node-appdmg <- DIESE ÜBERPRÜFUNG ANTWORT OBEN!
hinzugefügt der Autor Prof. Falken, Quelle
chmod ist völlig sinnlos, da es sudo erfordert und nichts bewirkt. Das resultierende DMG ist unabhängig davon vollständig schreibgeschützt.
hinzugefügt der Autor Barry, Quelle
Ausgezeichnet. Zwei Fragen dazu: 1. Sie empfehlen sleep nach dem Anhängen des Bildes. Wie lang? Ist es nicht möglich, deterministisch auf den Abschluss des Prozesses zu warten? Gleiches gilt für delay 5 in Ihrem AppleScript. Ich bin immer auf der Hut vor solchen willkürlichen Wartezeiten, nachdem ich sehr schlechte Erfahrungen mit ihnen gemacht habe. 2. In Ihrem Schritt 6 rufen Sie zweimal sync auf - warum?
hinzugefügt der Autor Konrad Rudolph, Quelle
Ich kann die Verknüpfung für den Ordner "/ Applications" nicht mithilfe der obigen Schritte erstellen. Ich erhalte eine "Leere Datei" anstelle der Ordnerverknüpfung "/ Application".
hinzugefügt der Autor Nandhakumar, Quelle
Was macht Schritt 1?
hinzugefügt der Autor Stephen, Quelle
Wenn das Skript bis zum Timeout bei der Zeile "Aktualisierung ohne Registrierung von Anwendungen" unterbrochen wird, wurde Schritt 1 nicht ausgeführt (oder wurde rückgängig gemacht). Ich habe das gerade auf die harte Tour herausgefunden.
hinzugefügt der Autor jmaynard, Quelle

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 allzu gut. Ich denke, das Problem ist, dass Apple das Metadatenformat für die notwendigen Daten nicht wirklich dokumentiert.

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

  1. Create a new DMG, writeable(!), big enough to hold the expected binary and extra files like readme (sparse might work).

  2. Mount the DMG and give it a layout manually in Finder or with whatever tools suits you for doing that (see FileStorm link at the bottom for a good tool). The background image is usually an image we put into a hidden folder (".something") on the DMG. Put a copy of your app there (any version, even outdated one will do). Copy other files (aliases, readme, etc.) you want there, again, outdated versions will do just fine. Make sure icons have the right sizes and positions (IOW, layout the DMG the way you want it to be).

  3. Unmount the DMG again, all settings should be stored by now.

  4. Write a create DMG script, that works as follows:

    • It copies the DMG, so the original one is never touched again.
    • It mounts the copy.
    • It replaces all files with the most up to date ones (e.g. latest app after build). You can simply use mv or ditto for that on command line. Note, when you replace a file like that, the icon will stay the same, the position will stay the same, everything but the file (or directory) content stays the same (at least with ditto, which we usually use for that task). You can of course also replace the background image with another one (just make sure it has the same dimensions).
    • After replacing the files, make the script unmount the DMG copy again.
    • Finally call hdiutil to convert the writable, to a compressed (and such not writable) DMG.

Diese Methode klingt vielleicht nicht optimal, aber vertrauen Sie mir, es funktioniert wirklich gut in der Praxis. Sie können das Original-DMG (DMG-Template) sogar unter Versionskontrolle (z. B. SVN) setzen. Wenn Sie es also versehentlich ändern/zerstören, können Sie einfach zu einer Revision zurückkehren, bei der es noch in Ordnung war. Sie können die DMG-Vorlage zusammen mit allen anderen Dateien, die zum DMG gehören (Liesmich, URL-Datei, Hintergrundbild), unter Versionskontrolle zu Ihrem Xcode-Projekt hinzufügen und dann ein Ziel erstellen (zB externes Ziel namens "DMG erstellen") und führen Sie das DMG-Skript von oben aus und fügen Sie Ihr altes Hauptziel als abhängiges Ziel hinzu. Sie können auf Dateien in der Xcode-Struktur mit $ {SRCROOT} im Skript zugreifen (ist immer das Ursprungsstammverzeichnis Ihres Produkts) und Sie können mit $ {BUILT_PRODUCTS_DIR} auf Build-Produkte zugreifen (ist immer das Verzeichnis, in dem Xcode die Build-Ergebnisse erstellt) .

Ergebnis: Tatsächlich kann Xcode das DMG am Ende des Builds erzeugen. Ein DMG, das zur Veröffentlichung bereit ist. Nicht nur Sie können ein relase DMG ziemlich einfach auf diese Weise erstellen, Sie können dies auch in einem automatisierten Prozess tun (auf einem kopflosen Server, wenn Sie möchten), mit xcodebuild von der Befehlszeile (automatisierte nächtliche Builds zum Beispiel).

Bezüglich des anfänglichen Layouts der Vorlage ist FileStorm ein gutes Werkzeug dafür. 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 automatisieren, um ein DMG zu erstellen (z. B. über AppleScript), habe das nie versucht, aber sobald man das perfekte Template DMG gefunden hat, ist es wirklich einfach, es für jedes Release zu aktualisieren.

0
hinzugefügt
Wir haben den Packprozess vom Build-Prozess getrennt, weil er von verschiedenen Personen zu unterschiedlichen Zeiten ausgeführt wird. Der Paketprozess erstellt Installationsprogramme für Windows, Windows CE, Symbian, AIX, Linux und Solaris.
hinzugefügt der Autor Ludvig A. Norin, Quelle
Es ist nicht das gleiche Szenario. Wir fügen Produkte oft kurzfristig hinzu. Die minimale manuelle Routine bedeutet, dass ein Skript ausgeführt wird, das dem Produkt einen Namen und einige andere Attribute gibt. Darüber hinaus gab es Gründe, warum wir uns entschieden haben, diese Art von Lösung nicht zu verwenden.
hinzugefügt der Autor Ludvig A. Norin, Quelle
Ich habe die Idee, dies zu tun, aus mehreren Gründen bereits verworfen. Hier sind zwei von ihnen: Der Inhalt der Installer wird mit dem Produkt variieren, und wir wollen nur auf Software verlassen, die auf den Packmaschinen und Skripten installiert ist - eine einzige, minimale manuelle Routine zum Hinzufügen neuer Produkte.
hinzugefügt der Autor Ludvig A. Norin, Quelle
Scheint wie ein hässlicher Weg, es zu tun, aber nachdem ich versucht habe, die oben genannten Ansätze zu versuchen, gebe ich diesem einen Wirbel. Aber nachdem ich die Dateien ersetzt und getrennt habe, ist mein Bild unverändert und enthält nicht die neuen Dateien. Was könnte ich falsch machen? hdiutil anhängen "$ COPY_OF_IMAGE" -readwrite -mountpoint "$ STAGING_DIR" finde "$ DEST_KM_APP" -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf cp -fR "$ SOURCE_KM_APP /" "$ DEST_KM_APP" hdiutil trennt $ STAGING_DIR $ VERBOSITY
hinzugefügt der Autor Tom Bogle, Quelle
Scheint so, als ob dieser Ansatz funktioniert: crazyedy.com/tech/?p=535
hinzugefügt der Autor Tom Bogle, Quelle
Dies ist das gleiche Szenario wie wir. Wir haben mehr als ein Dutzend Produkte; Jeder hat eine ganz andere DMG. Erstellen einer Vorlage DMG pro Produkt ist eine einmalige Aufgabe und dauert nur wenige Minuten. Und was meinst du mit "Installateur"? PKG/MPKG Pakete installieren?
hinzugefügt der Autor Mecki, Quelle
@Ivan: Du hast Recht - Antwort reparieren. Entschuldigung wegen dieses Tippfehlers
hinzugefügt der Autor Mecki, Quelle
Sie beziehen sich wahrscheinlich auf hdiutil, nicht auf hdutil.
hinzugefügt der Autor Ivan Vučica, Quelle
Wenn das Root-Fenster des Disk-Images beim Einbinden des Image geöffnet werden soll, fügen Sie in Schritt 2 Folgendes hinzu: bless --openfolder "/ Volumes/My Great Software" .
hinzugefügt der Autor bleater, Quelle
Für mich - die Skriptversion oben funktioniert nicht (es würde konsequent den Link Anwendungen ablehnen). Die Verwendung dieser Methode funktionierte gut und zuverlässig, obwohl ein solcher manueller Prozess erforderlich war.
hinzugefügt der Autor Chris R, Quelle

Diese Antworten sind viel zu kompliziert und die Zeiten haben sich geändert. Folgendes funktioniert am 10.9 einwandfrei, 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 eines schreibgeschützten 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 noch etwas passieren muss, ist es am einfachsten, eine temporäre Kopie von SRC_DIR zu erstellen und Änderungen darauf anzuwenden, bevor Sie ein DMG erstellen.

0
hinzugefügt
Diese Antwort fügt dem, was vorher geschrieben wurde, nichts hinzu und beantwortet auch nicht die ursprüngliche Frage (es geht nicht nur darum, ein Symbol in das dmg zu setzen oder es zu signieren; es geht darum, Grafiken und positionierte Icons programmatisch hinzuzufügen ein DMG).
hinzugefügt der Autor Ludvig A. Norin, Quelle

Ich fand diese großartige Mac-App, um den Prozess zu automatisieren - http://www.araelium.com/dmgcanvas/ Sie müssen schauen, wenn Sie dmg Installer für Ihre Mac App erstellen

0
hinzugefügt
hinzugefügt der Autor Prof. Falken, Quelle
Dieser ist kostenlos: link
hinzugefügt der Autor NetworkSys Co. Ltd, Quelle
Beachten Sie, dass dies kein kostenloses Programm ist, daher ist es für viele Umgebungen nicht geeignet.
hinzugefügt der Autor jmaynard, Quelle

Es gibt ein kleines Bash-Skript namens create-dmg , das schicke DMGs mit benutzerdefinierten Hintergründen, benutzerdefinierten Symbolpositionen und Datenträgername

Ich habe es vor vielen Jahren für die Firma gebaut, die ich damals leitete; es überlebt seither den Beitrag anderer Leute und soll angeblich gut funktionieren.

Es gibt auch node-appdmg , das wie ein modernerer und aktiverer Ansatz aussieht, basierend auf Node.js; schau es dir auch an.

0
hinzugefügt
Könnte es dieser sein: github.com/andreyvit/create-dmg
hinzugefügt der Autor David Karlsson, Quelle
create-dmg funktioniert nicht gut. Wenn Sie diese Funktion benötigen, verwenden Sie sie nicht.
hinzugefügt der Autor laike9m, Quelle
@AndreyTarantsov Es gibt bereits ein Problem github.com/andreyvit/create-dmg/issues/18 .
hinzugefügt der Autor laike9m, Quelle
@AndreyTarantsov Eh, es ist dein Projekt, ich dachte, du wüsstest all diese Probleme ...
hinzugefügt der Autor laike9m, Quelle
@ laike9m Kannst du es bitte als Problem melden, wenn du Besonderheiten kennst? Vielleicht wird es jemand reparieren.
hinzugefügt der Autor Andrey Tarantsov, Quelle
@ laike9m Interessant, wusste das nicht. Vielen Dank.
hinzugefügt der Autor Andrey Tarantsov, Quelle
@ laike9m Es ist mehr als 5 Jahre her, seit ich es zuletzt berührt habe. Ich betrachte DMGs nicht als den besten Weg, Mac-Software zu vertreiben. Es überlebt also auf Beiträge von anderen - hoffentlich wird auch jemand das Icon Problem herausfinden.
hinzugefügt der Autor Andrey Tarantsov, Quelle
@ Zmey Nun, als Benutzer bevorzuge ich Zip-Dateien bei weitem. Bonuspunkte für automatisches Kopieren nach /Anwendungen , wenn die App erkennt, dass sie von ~/Downloads ausgeführt wird. Siehe auch diesen alten Artikel von John Gruber .
hinzugefügt der Autor Andrey Tarantsov, Quelle
hinzugefügt der Autor Andrey Tarantsov, Quelle
Diese Sache funktioniert super!
hinzugefügt der Autor vpicaver, Quelle
@AndreyTarantsov hilft sehr.
hinzugefügt der Autor simon xu, Quelle
Der Link zu Ihrem Bash-Skript ist kaputt. Kannst du es auf github.com genau beschreiben? Vielen Dank
hinzugefügt der Autor dquimper, Quelle
@AndreyTarantsov Vielen Dank! Es ist eine sehr interessante Idee.
hinzugefügt der Autor Zmey, Quelle
@AndreyTarantsov Welchen Weg findest du für Mac-Apps am besten?
hinzugefügt der Autor Zmey, Quelle
@AndreyTarantsov nette Arbeit, danke!
hinzugefügt der Autor finnan, Quelle

.DS_Store-Dateien speichert Windows-Einstellungen in Mac. Windows-Einstellungen umfassen das Layout der Symbole, den Fensterhintergrund, die Größe des Fensters usw. Die Datei .DS_Store wird zum Erstellen des Fensters für eingebundene Bilder benötigt, um die Anordnung der Dateien und den Windows-Hintergrund beizubehalten.

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

0
hinzugefügt
Aber fügen Sie dem dmg zunächst ein Hintergrundbild hinzu, indem Sie etwas wie .background.png benennen und dann mit Cmd-J das (!) Bild zum Hintergrund hinzufügen.
hinzugefügt der Autor Gijs, Quelle

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

0
hinzugefügt
Vielen Dank! Ist es möglich, die Größe ohne Hintergrundbild zu ändern?
hinzugefügt der Autor avi, Quelle
Sieht gut aus, aber es scheint keine Option zu haben, die Größe des Fensters zu ändern.
hinzugefügt der Autor avi, Quelle
hinzugefügt der Autor Prof. Falken, Quelle
Das sieht sehr interessant aus.
hinzugefügt der Autor Konrad Rudolph, Quelle
Mein Team funktioniert wunderbar und automatisch auf einem Jenkins CI-Build-Server, komplett mit Hintergrund, ziehen Sie ihn zum Alias ​​"Anwendungen". Laufen, gehen Sie nicht zu DropDMG, um Disk-Images zu erstellen.
hinzugefügt der Autor Paul Collins, Quelle
@avi DropDMG passt das Fenster automatisch an das von Ihnen festgelegte Hintergrundbild an (oder in das Bild einfügen, falls gewünscht.
hinzugefügt der Autor Michael Tsai, Quelle
@avi Wenn Sie kein Hintergrundbild verwenden, können Sie die Dimensionen mit "BlankBackgroundSize" festlegen. esoterische Präferenz .
hinzugefügt der Autor Michael Tsai, Quelle
Gute App, ich werde sie kaufen, nachdem meine Probezeit abgelaufen ist.
hinzugefügt der Autor kilik52, Quelle

Ich brauche auch Kommandozeilen-Ansatz, um das Verpacken und Erstellen von DMGs "programmatisch in einem Skript" durchzuführen. Die beste Antwort, die ich bisher gefunden habe, stammt vom Adium-Projekt 'Release building framework' (siehe R1). Es gibt ein benutzerdefiniertes Skript (AdiumApplescriptRunner), mit dem Sie OSX WindowsServer GUI-Interaktion vermeiden können. Bei "osascript applescript.scpt" müssen Sie sich als Builder anmelden und die Erstellung des dmg über eine vt100-Sitzung in der Befehlszeile ausführen.

OSX Paket Management System ist nicht so fortgeschritten im Vergleich zu anderen Unixen, die diese Aufgabe einfach und systematisch erledigen können.

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

0
hinzugefügt

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

Wie auch immer, wer interessiert ist kann es auf PyPi finden ; Die Dokumentation ist verfügbar unter Read The Docs .

0
hinzugefügt

Bringen Sie diese Frage mit dieser Antwort auf den neuesten Stand.

appdmg is a simple, easy-to-use, open-source command line program that creates dmg-files from a simple json specification. Take a look at the readme at the official website:

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

Schnelles Beispiel:

  1. Install appdmg

    npm install -g appdmg
    
  2. Write a json file (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. Run program

    appdmg spec.json test.dmg
    

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

0
hinzugefügt
@Creator: Kannst du es bitte wie dieses eine Angebot GUI ohne Drag & Drop machen? s.sudre.free.fr/Software/Packages/about.html
hinzugefügt der Autor YumYumYum, Quelle
einfach und effektiv. Der einzige Nachteil ist, dass npm installiert werden muss
hinzugefügt der Autor Jack James, Quelle
@Joey, könnten Sie ein Problem im Github-Repository öffnen, wenn es nicht für Sie funktioniert?
hinzugefügt der Autor Linus Unnebäck, Quelle
Wenn sich die .app-Datei nicht im selben Ordner wie die JSON-Datei befindet, funktioniert dies nicht. Es wird der Fehler "Datei nicht gefunden" angezeigt, wenn Sie einen relativen Pfad in "Pfad" angeben.
hinzugefügt der Autor Joey, Quelle

Ich habe es endlich in meinem eigenen Projekt (das ist in Xcode) funktioniert. Das Hinzufügen dieser 3 Skripte zu Ihrer Erstellungsphase erstellt automatisch ein Disk Image für Ihr Produkt, das nett und ordentlich ist. Alles, was Sie tun müssen, ist Ihr Projekt zu erstellen und die DMG wird in Ihrem Produktordner warten.

Skript 1 (Temp-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 (Set Window Properties 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 das Fenster funktioniert für mein Projekt speziell aufgrund der Größe meiner Hintergrundbild- und Iconauflösung; Möglicherweise müssen Sie diese Werte für Ihr eigenes Projekt ändern.

Skript 3 (Make Final 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 sich die verwendeten Bilddateien im Verzeichnis $ PROJECT_DIR/$ PROJECT_NAME/befinden!

0
hinzugefügt
Es erstellt ein leeres Image auf meinem Projekt. Irgendein Vorschlag.
hinzugefügt der Autor ManiaChamp, Quelle
Shell-Skript Teil funktioniert nur, aber wie kann ich hinzufügen Apple-Skript mit Shell-Skript in RunScript unter Build-Phase zeigt Fehler, jede Apple-Skript-Anweisung ist Symbol nicht gefunden.
hinzugefügt der Autor ManiaChamp, Quelle

Um ein gut aussehendes DMG zu erstellen, können Sie nun einfach einige gut geschriebene offene Quellen verwenden:

0
hinzugefügt
Ich entschied mich, node-appdmg zu installieren. Es ist gut für das, was ich brauche.
hinzugefügt der Autor Pamela Cook - LightBe Corp, Quelle
Der Link zu dmgbuild funktioniert nicht.
hinzugefügt der Autor Pamela Cook - LightBe Corp, Quelle
@ PamelaCook-LightBeCorp Falls Sie noch interessiert sind. Der Link zu dmgbuild wurde repariert.
hinzugefügt der Autor SubOptimal, Quelle
Vielleicht haben sie es bewegt. Sie können create-dmg und node-appdmg verwenden. Ich benutze create-dmg. Das ist gut.
hinzugefügt der Autor Anni S, Quelle