Cum creez un DMG frumos pentru Mac OS X folosind instrumente de linie de comandă?

Trebuie să creez un program de instalare frumos pentru o aplicație Mac. Vreau să fie o imagine pe disc (DMG), cu o dimensiune predefinită, aspect și imagine de fundal.

Trebuie să fac acest lucru într-un script, într-un script, pentru a fi integrat într-un sistem de construcție existent (mai mult un sistem de pachete, deoarece acesta creează numai instalatori.

Am deja creația DMG făcută folosind "hdiutil", ceea ce nu am aflat încă este cum să faceți un layout de pictograme și să specificați un bitmap de fundal.

0
adăugat autor Prof. Falken, sursa
Nu este ceva pentru Întrebări diferite?
adăugat autor Lenar Hoyt, sursa

14 răspunsuri

Dacă doriți să setați pictograma personalizată de volum, utilizați comanda de mai jos

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

Acum creați citirea/scrierea dmg

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
0
adăugat
"calea ta" este numele DMG. (/ Volume/dmgName)
adăugat autor Parag Bafna, sursa
Ar trebui să copiați fișierul icns. cp "/Volume/customIcon.icns" "/Volume/dmgName/.VolumeIcon.icns"
adăugat autor Parag Bafna, sursa
Puteți explica ce înseamnă "calea voastră" aici? Pot folosi orice fișier icoane pe disc și SetFile o va copia sau ar trebui să folosesc un fișier care este în interiorul .dmg? Am doar un Mac, deci este greu să testați dacă lucrurile vor funcționa pe alte mașini.
adăugat autor Milan Babuškov, sursa

Pentru cei care sunteți interesați de acest subiect, ar trebui să menționez modul în care creez DMG:

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

Unde

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
adăugat
Este bine, dar nu abordează nevoia reală (imaginea de fundal, poziționarea elementelor în dosar etc.)
adăugat autor Tom Bogle, sursa

După o mulțime de cercetări, am venit cu acest răspuns, și aș pune-o aici ca răspuns pentru propria mea întrebare, ca referință:

  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 
    

Pe Snow Leopard, applescript-ul de mai sus nu va seta poziția corectă a pictogramei - pare a fi o eroare de Leopard de zăpadă. O soluție este de a apela pur și simplu aproape/deschis după setarea pictogramelor, adică

..
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
adăugat
Cred că am găsit o ușoară glitch - există un eject în AppleScript, care este făcut înainte de a încerca să rulați chmod. chmod va eșua deoarece discul este acum ejectat.
adăugat autor Trejkaz, sursa
Acesta permite applescript pentru a simula mouse-ul și intrarea tastatură și o grămadă de alte lucruri.
adăugat autor Ludvig A. Norin, sursa
Eliminarea permisiunilor de scriere din folderul sursă a fost necesară în una dintre versiunile anterioare ale hdiutil. Se presupune în acest articol că comenzile sunt executate ca root, care pot sau nu să fie necesare pentru ca toate celelalte părți să funcționeze. Versiunea actuală a hdiutil nu are grijă de privilegiile de scriere din folderul sursă.
adăugat autor Ludvig A. Norin, sursa
Nu am găsit nicio modalitate de așteptare deterministă pentru finalizarea comenzii "actualizare fără înregistrarea aplicațiilor". Nu sunt sigur că somnul este necesar după ce "hdiutil attach", va trebui să verificați documentația (man hdiutil). Sincronizarea ar trebui să fie necesară doar o singură dată, o fac de două ori din vechiul obișnuit de la vechile zile bune ale SunOS.
adăugat autor Ludvig A. Norin, sursa
github.com/LinusU/node-appdmg <- ACESTE REDUCE RĂSPUNSUL DE MAI SUS!
adăugat autor Prof. Falken, sursa
chmod este total inutil pentru că ar necesita sudo și nu realizează nimic. DMG-ul rezultat este complet citit, indiferent.
adăugat autor Barry, sursa
Excelent. Două întrebări despre acest lucru: 1. Vă recomandăm sleep după mounding imaginea. Pentru cat timp? Nu este posibilă așteptarea deterministă pentru finalizarea procesului? Același lucru pentru delay 5 în AppleScript. Sunt mereu precaut de astfel de ori de așteptare arbitrară, având o experiență foarte rea cu ei. 2. În pasul 6, sunați de două ori sync - de ce?
adăugat autor Konrad Rudolph, sursa
Nu pot să creez comanda rapidă pentru dosarul "/ Applications" utilizând pașii de mai sus. Obținerea unui "dosar gol" în locul comenzii rapide a dosarului "/ Application".
adăugat autor Nandhakumar, sursa
Ce face pasul 1?
adăugat autor Stephen, sursa
În cazul în care script-ul se blochează până când acesta este scos din rândul "actualizare fără înregistrare aplicații", atunci pasul 1 nu a fost realizat (sau a fost anulat). Tocmai am aflat acest lucru din greu.
adăugat autor jmaynard, sursa

Nu merge acolo. Ca dezvoltator Mac pe termen lung, vă asigur că nici o soluție nu funcționează bine. Am încercat atât de multe soluții, dar toate nu sunt prea bune. Cred că problema este că Apple nu documentează într-adevăr formatul meta-datelor pentru datele necesare.

Iată cum o fac de mult timp, cu succes:

  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.

Această metodă s-ar putea să nu pară optimă, dar crede-mă, funcționează foarte bine în practică. Puteți introduce DMG-ul original (șablon DMG) chiar și sub controlul versiunii (de exemplu, SVN), deci, dacă vreodată îl schimbați sau distrugeți accidental, puteți să vă întoarceți la o revizuire în care era încă în regulă. Puteți adăuga șablonul DMG la proiectul dvs. Xcode, împreună cu toate celelalte fișiere care aparțin DMG (readme, fișier URL, imagine de fundal), toate sub controlul versiunii și apoi să creați o țintă (de exemplu, o destinație externă numită "Creați DMG") și rulați scriptul DMG de mai sus și adăugați vechea țintă principală ca țintă dependentă. Puteți accesa fișierele din arborele Xcode utilizând scriptul $ {SRCROOT} (este întotdeauna rădăcina sursă a produsului dvs.) și puteți accesa produsele de construcție utilizând $ {BUILT_PRODUCTS_DIR} (este întotdeauna directorul unde Xcode creează rezultatele construirii) .

Rezultat: De fapt, Xcode poate produce DMG la sfârșitul construcției. Un DMG gata de eliberare. Nu numai că puteți crea un relaz DMG destul de ușor în acest fel, de fapt puteți face acest lucru într-un proces automatizat (pe un server fără capete, dacă doriți), folosind xcodebuild din linia de comandă (automate construite pe timp de noapte, de exemplu).

În ceea ce privește aspectul inițial al șablonului, FileStorm este un instrument bun pentru a face acest lucru. Este comercială, dar foarte puternică și ușor de folosit. Versiunea normală este mai mică de 20 $, deci este într-adevăr accesibilă. Poate că se poate automatiza fișierul FileStorm pentru a crea un DMG (de exemplu, prin intermediul AppleScript), nu a încercat niciodată acest lucru, dar odată ce ați găsit modelul perfect DMG, este foarte ușor să îl actualizați pentru fiecare lansare.

0
adăugat
Am separat procesul de ambalare de procesul de construire, pentru că este realizat de oameni diferiți în momente diferite. Procesul de pachete creează instalatori pentru Windows, Windows CE, Symbian, AIX, Linux și Solaris.
adăugat autor Ludvig A. Norin, sursa
Nu este același scenariu. Adăugăm adesea produse, cu o notificare prealabilă. Rutina manuală minimă înseamnă executarea unui script care oferă produsului un nume și câteva alte atribute. Există și alte motive care ne-au determinat să luăm decizia de a nu folosi o astfel de soluție.
adăugat autor Ludvig A. Norin, sursa
Am renunțat deja la ideea de a face acest lucru din acest motiv, din mai multe motive. Iată două dintre ele: conținutul instalatorilor va varia în funcție de produs și dorim să ne bazăm doar pe software-ul instalat pe pachetele și scripturile - o rutină manuală unică, minimală, pentru adăugarea de noi produse.
adăugat autor Ludvig A. Norin, sursa
Pare a fi un mod urât de a face acest lucru, dar după ce a izgonit încercând abordările de mai sus, dau asta un vârtej. Dar după ce înlocuiesc fișierele și am detașat, imaginea mea este neschimbată și nu conține fișierele noi. Ce s-ar putea să fac greșit? hdiutil atașați "$ COPY_OF_IMAGE" -readwrite -mountpoint "$ STAGING_DIR" găsi "$ DEST_KM_APP" -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf cp -fR "$ SOURCE_KM_APP /" "$ DEST_KM_APP" hdiutil detașați $ STAGING_DIR $ VERBOSITY
adăugat autor Tom Bogle, sursa
Se pare că această abordare funcționează: crazyedy.com/tech/?p=535
adăugat autor Tom Bogle, sursa
Acesta este același scenariu ca și noi. Avem mai mult de o duzină de produse; fiecare are un DMG complet diferit. Crearea unui singur model DMG pe produs este o sarcină unică și vă va duce câteva minute. Și ce vrei să spui prin "instalator"? PKG/MPKG instala pachetele?
adăugat autor Mecki, sursa
@Ivan: Ai dreptate - replici. Îmi pare rău pentru acea tipo
adăugat autor Mecki, sursa
Probabil că te referi la hdiutil, nu hdutil.
adăugat autor Ivan Vučica, sursa
Dacă doriți ca fereastra de root a imaginii discului să se deschidă atunci când imaginea este montată, adăugați următoarele la pasul 2: bless --openfolder "/ Volumes/My Great Software" .
adăugat autor bleater, sursa
Pentru mine - versiunea scripturi de mai sus nu a reușit să funcționeze (ar refuza în mod consecvent să creeze linkul Aplicații). Utilizarea acestei metode a funcționat bine și în mod credibil, în ciuda faptului că a solicitat un astfel de proces manual de configurare.
adăugat autor Chris R, sursa

Aceste răspunsuri sunt prea complicate și vremurile s-au schimbat. Următoarele lucrări de pe 10.9 sunt bine, permisiunile sunt corecte și arată bine.

Creați o DMG numai pentru citire dintr-un director

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

Creați DMG numai pentru citire cu o pictogramă (tip .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

Dacă este nevoie să se întâmple altceva, acest lucru este cel mai simplu să faceți o copie temporară a SRC_DIR și să aplicați modificările aduse înainte de a crea un DMG.

0
adăugat
Acest răspuns nu adaugă nimic pentru ceea ce a fost scris mai devreme și nu răspunde la întrebarea inițială (nu este vorba doar de a pune o pictogramă în dmg sau de ao semna, întrebarea este de a adăuga grafic și poziționa pictogramele programabil a dmg).
adăugat autor Ludvig A. Norin, sursa

Am gasit aceasta aplicatie mac mac pentru a automatiza procesul - http://www.araelium.com/dmgcanvas/ trebuie să aveți o privire dacă creați programul de instalare dmg pentru aplicația dvs. Mac

0
adăugat
adăugat autor Prof. Falken, sursa
Aceasta este gratuită: link
adăugat autor NetworkSys Co. Ltd, sursa
Rețineți că acesta nu este un program gratuit, deci nu este potrivit pentru multe medii.
adăugat autor jmaynard, sursa

Există un mic script Bash numit create-dmg care construiește DMG-uri fantezie cu fundaluri personalizate, poziționarea personalizată a pictogramelor și numele volumului.

Am construit-o cu mulți ani în urmă pentru compania pe care am fugit-o la vremea respectivă; acesta supraviețuiește contribuției celorlalți de atunci și, potrivit surselor, funcționează bine.

Există, de asemenea, node-appdmg care arată ca un efort mai modern și mai activ bazat pe Node.js; verificați și el.

0
adăugat
adăugat autor David Karlsson, sursa
create-dmg nu face bine pictograma de poziție NOT . Dacă aveți nevoie de această funcție, nu o utilizați.
adăugat autor laike9m, sursa
@AndreyTarantsov Există deja o problemă github.com/andreyvit/create-dmg/issues/18 .
adăugat autor laike9m, sursa
@AndreyTarantsov Eh, e proiectul tău, am crezut că știi toate aceste probleme ...
adăugat autor laike9m, sursa
@ laike9m Vă rog să-l raportați ca pe o problemă, dacă cunoașteți specificul? Poate cineva o va rezolva.
adăugat autor Andrey Tarantsov, sursa
@ laike9m Interesant, nu știu asta. Mulțumiri.
adăugat autor Andrey Tarantsov, sursa
@ laike9m Au trecut mai mult de 5 ani de când am atins-o ultima dată. Nu cred că DMG-urile reprezintă cea mai bună modalitate de a distribui software-ul Mac mai mult. Deci, ea supraviețuiește pe contribuțiile altora - sperăm că cineva va da seama și de problema icoanelor.
adăugat autor Andrey Tarantsov, sursa
@ Zmey Ei bine, ca utilizator, prefer fisierele zip de departe. Puncte bonus pentru copierea automată la /Applications dacă aplicația detectează că rulează de la ~/Downloads . Vedeți de asemenea acest vechi articol de John Gruber .
adăugat autor Andrey Tarantsov, sursa
adăugat autor Andrey Tarantsov, sursa
Acest lucru funcționează excelent!
adăugat autor vpicaver, sursa
@AndreyTarantsov ajută foarte mult.
adăugat autor simon xu, sursa
Legătura cu scriptul de bash este întreruptă. Puteți să-l puneți într-un gist pe github.com? Mulțumiri
adăugat autor dquimper, sursa
@AndreyTarantsov Vă mulțumim! Este o idee foarte interesantă.
adăugat autor Zmey, sursa
@AndreyTarantsov Care credeți că este cel mai bun pentru distribuția de aplicații Mac?
adăugat autor Zmey, sursa
@ Munca frumoasa AndreeaTarantsov, vă mulțumesc!
adăugat autor finnan, sursa

Fișierele .DS_Store stochează setările Windows pe Mac. Setările Windows includ configurația de pictograme, fundalul ferestrei, dimensiunea ferestrei etc. Fișierul .DS_Store este necesar pentru crearea ferestrei pentru imagini montate pentru a păstra aranjamentul fișierelor și fundalul ferestrelor.

După ce ați creat fișierul .DS_Store, îl puteți copia doar în programul de instalare creat (DMG).

0
adăugat
Dar mai întâi adăugați o imagine de fundal la dmg, numind-o ceva de genul .background.png și apoi folosind Cmd-J pentru a adăuga acea imagine (!) În fundal.
adăugat autor Gijs, sursa

Aplicația mea, DropDMG , este o modalitate ușoară de a crea imagini pe disc cu imagini de fundal, machete de pictograme, volum personalizat icoane și acorduri de licență software. Acesta poate fi controlat dintr-un sistem de construcție prin instrumentul "dropdmg" de linie de comandă sau AppleScript. Dacă doriți, imaginile și fișierele RTF pot fi stocate sub sistemul de control al versiunii.

0
adăugat
Mare, mulțumesc! Este posibilă redimensionarea imaginii de fundal?
adăugat autor avi, sursa
Arată frumos, dar nu pare să aibă opțiunea de a redimensiona fereastra.
adăugat autor avi, sursa
adăugat autor Prof. Falken, sursa
Arată foarte interesant.
adăugat autor Konrad Rudolph, sursa
Echipa mea are acest lucru frumos și automat pe un server Jenkins CI construi, complet cu fundal, trageți la Applications alias. Rulați, nu mergeți, la DropDMG pentru a face imagini pe disc.
adăugat autor Paul Collins, sursa
@avi DropDMG mărește automat fereastra în imaginea de fundal pe care o setați (sau inserați în imaginea respectivă dacă doriți).
adăugat autor Michael Tsai, sursa
@avi Dacă nu utilizați o imagine de fundal, puteți seta dimensiunile utilizând "BlankBackgroundSize" preferință esoterică .
adăugat autor Michael Tsai, sursa
Aplicație bună, o să-l cumpăr după expirarea procesului.
adăugat autor kilik52, sursa

De asemenea, am nevoie de utilizarea abordării liniei de comandă pentru a face programarea ambalajului și a dmg-ului "programabil într-un scenariu". Cel mai bun răspuns pe care l-am găsit până acum este de la proiectul Adium "Eliberarea cadrului clădirii (vezi R1). Există un script personalizat (AdiumApplescriptRunner) pentru a vă permite să evitați interacțiunea GUI cu OSX WindowsServer. Abordarea "osascript applescript.scpt" vă solicită să vă conectați ca constructor și să executați crearea dmg dintr-o sesiune de comandă vt100.

Sistemul de management al pachetelor OSX nu este atât de avansat în comparație cu alte Unixen care pot face această sarcină ușor și sistematic.

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

0
adăugat

Tocmai am scris o utilitate nouă (prietenoasă) pentru a face acest lucru. Nu se bazează pe Finder/AppleScript sau pe oricare dintre API-urile Alias ​​Manager (depreciate) și este ușor de configurat și utilizat.

Oricum, oricine este interesat poate găsi pe PyPi ; documentația este disponibilă în Citiți Documentele .

0
adăugat

Aduceți această întrebare la zi furnizând acest răspuns.

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

Un exemplu rapid:

  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
    

(disclaimer, eu sunt creatorul de aplicații)

0
adăugat
@Creator: poți să faci ca să avansezi ca această ofertă GUI fără a trebui să tragi și să renunți? s.sudre.free.fr/Software/Packages/about.html
adăugat autor YumYumYum, sursa
simplu și eficient. Singurul dezavantaj este că necesită instalarea npm
adăugat autor Jack James, sursa
@ Joey, ai putea deschide o problemă în depozitul Github dacă nu funcționează pentru tine?
adăugat autor Linus Unnebäck, sursa
Dacă fișierul .app nu se află în același director ca fișierul json, acest lucru nu funcționează, dă eroare "file not found" eroare când specificați o cale relativă în "path"
adăugat autor Joey, sursa

Am reușit în final să lucrez în propriul proiect (care se întâmplă să fie în Xcode). Adăugarea acestor 3 scripturi în faza de creare va crea automat o imagine pe disc pentru produsul dvs. care este frumos și elegant. Tot ce trebuie să faceți este să vă construiți proiectul și DMG va aștepta în dosarul dvs. de produse.

Script 1 (Creare imagine imagine temporară):

#!/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 (Setare ferestre proprietăți 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

Măsurarea de mai sus pentru fereastra de lucru pentru proiectul meu, în special datorită dimensiunii picului de fundal și rezoluția pictogramei; este posibil să fie necesar să modificați aceste valori pentru propriul proiect.

Script 3 (Faceți Final Script Image Disk):

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

Asigurați-vă că fișierele imagine pe care le folosiți sunt în directorul $ PROJECT_DIR/$ PROJECT_NAME!

0
adăugat
Creează imagini necompletate pe proiectul meu. Vreo idee.
adăugat autor ManiaChamp, sursa
Shell script-ul funcționează numai, dar cum pot adăuga script-ul Apple cu Shell Script în RunScript în faza de construcție se afișează eroare, fiecare declarație de apple script este simbol nu a fost găsit.
adăugat autor ManiaChamp, sursa

Pentru a crea un DMG drăguț, puteți folosi acum doar câteva surse deschise bine scrise:

0
adăugat
Am decis să instalez nodul-appdmg. Este bine pentru ceea ce am nevoie.
adăugat autor Pamela Cook - LightBe Corp, sursa
Legătura cu dmgbuild nu funcționează.
adăugat autor Pamela Cook - LightBe Corp, sursa
@ PamelaCook-LightBeCorp În cazul în care sunteți în continuare interesat. Legătura cu dmgbuild a fost rezolvată.
adăugat autor SubOptimal, sursa
Poate că au mutat-o. Puteți utiliza crea-dmg și nod-appdmg. Eu folosesc crea-dmg. Este bine.
adăugat autor Anni S, sursa