Bagaimana cara membuat DMG yang tampak bagus untuk Mac OS X menggunakan alat baris perintah?

212

Saya perlu membuat installer yang bagus untuk aplikasi Mac. Saya ingin ini menjadi gambar disk (DMG), dengan ukuran yang telah ditentukan, tata letak, dan gambar latar belakang.

Saya perlu melakukan ini secara terprogram dalam sebuah skrip, untuk diintegrasikan dalam sistem build yang ada (sebenarnya lebih dari sistem paket, karena hanya membuat installer. Build dilakukan secara terpisah).

Saya sudah membuat kreasi DMG menggunakan "hdiutil", yang belum saya ketahui adalah bagaimana membuat tata letak ikon dan menentukan bitmap latar belakang.

Ludvig A Norin
sumber
1
Bukankah ini sesuatu untuk Ask Different?
Lenar Hoyt

Jawaban:

199

Setelah banyak penelitian, saya datang dengan jawaban ini, dan saya dengan ini menempatkannya di sini sebagai jawaban untuk pertanyaan saya sendiri, untuk referensi:

  1. Pastikan "Aktifkan akses untuk perangkat bantu" dicentang di System Preferences >> Universal Access. Diperlukan agar AppleScript berfungsi. Anda mungkin harus memulai ulang setelah perubahan ini (tidak berfungsi sebaliknya di Mac OS X Server 10.4).

  2. Buat R / W DMG. Itu harus lebih besar dari hasilnya. Dalam contoh ini, "bash" variabel bash berisi ukuran dalam Kb dan isi folder di bash "source" variabel akan disalin ke 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. Pasang gambar disk, dan simpan nama perangkat (Anda mungkin ingin menggunakan sleep selama beberapa detik setelah operasi ini):

    device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | \
             egrep '^/dev/' | sed 1q | awk '{print $1}')
    
  4. Simpan gambar latar belakang (dalam format PNG) dalam folder bernama ".background" di DMG, dan simpan namanya dalam variabel "backgroundPictureName".

  5. Gunakan AppleScript untuk mengatur gaya visual (nama .app harus dalam variabel bash "applicationName", gunakan variabel untuk properti lain sesuai kebutuhan):

    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. Finalisasi DMG dengan mengatur izin dengan benar, mengompresi dan melepaskannya:

    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 
    

Pada Snow Leopard, applescript di atas tidak akan mengatur posisi ikon dengan benar - sepertinya itu adalah bug Snow Leopard. Salah satu solusinya adalah dengan memanggil tutup / buka setelah mengatur ikon, yaitu:

..
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
sumber
1
Luar biasa. Dua pertanyaan tentang itu: 1. Anda rekomendasikan sleepsetelah membuat gambar. Berapa lama? Apakah tidak mungkin untuk secara deterministik menunggu selesainya proses? Sama untuk delay 5di AppleScript Anda. Saya selalu waspada terhadap waktu tunggu yang sewenang-wenang seperti itu, setelah memiliki pengalaman yang sangat buruk dengan mereka. 2. Pada langkah 6 Anda menelepon syncdua kali - mengapa?
Konrad Rudolph
Saya belum menemukan cara untuk secara deterministik menunggu penyelesaian perintah 'pembaruan tanpa mendaftarkan aplikasi'. Saya tidak yakin tidur diperlukan setelah "hdiutil attach", Anda harus memeriksa dokumentasi (man hdiutil). Sinkronisasi seharusnya hanya perlu dipanggil satu kali, saya melakukannya dua kali karena kebiasaan lama sejak masa SunOS yang baik.
Ludvig A. Norin
1
Ini memungkinkan applescript untuk mensimulasikan input mouse dan keyboard dan banyak hal lainnya.
Ludvig A. Norin
1
Jika skrip hang sampai habis pada baris "perbarui tanpa mendaftarkan aplikasi", maka langkah 1 belum dilakukan (atau telah dibatalkan). Saya baru saja menemukan ini dengan cara yang sulit.
Jay Maynard K5ZC
Saya pikir saya menemukan sedikit kesalahan - ada eject di AppleScript, yang dilakukan sebelum Anda mencoba menjalankan chmod. chmod akan gagal karena disk sekarang dikeluarkan.
Trejkaz
56

Ada sedikit skrip Bash yang disebut create-dmg yang membangun DMG mewah dengan latar belakang khusus, pemosisian ikon kustom dan nama volume.

Saya telah membangunnya bertahun-tahun yang lalu untuk perusahaan yang saya jalankan saat itu; itu bertahan atas kontribusi orang lain sejak saat itu, dan dilaporkan bekerja dengan baik.

Ada juga node-appdmg yang terlihat seperti upaya yang lebih modern dan aktif berdasarkan Node.js; lihat juga.

Andrey Tarantsov
sumber
7
Tautan ke skrip bash Anda rusak. Bisakah Anda memasukkannya ke intisari di github.com? Terima kasih
dquimper
create-dmg TIDAK memposisikan ikon dengan baik. Jika Anda membutuhkan fitur ini, jangan gunakan itu.
laike9m
1
@ laike9m Sudah lebih dari 5 tahun sejak saya terakhir menyentuhnya. Saya tidak menganggap DMG sebagai cara terbaik untuk mendistribusikan perangkat lunak Mac lagi. Jadi itu bertahan atas kontribusi orang lain - semoga seseorang akan mengetahui masalah ikon juga.
Andrey Tarantsov
3
@ Zmey Yah sebagai pengguna, saya lebih suka file zip sejauh ini. Poin bonus untuk penyalinan otomatis ke /Applicationsjika aplikasi mendeteksi itu berjalan dari ~/Downloads. Lihat juga artikel lama ini oleh John Gruber .
Andrey Tarantsov
1
@ Zmey Juga lihat artikel ini dengan tangkapan layar UI yang terlibat .
Andrey Tarantsov
37

Jangan ke sana. Sebagai pengembang Mac jangka panjang, saya dapat meyakinkan Anda, tidak ada solusi yang bekerja dengan baik. Saya mencoba banyak solusi, tetapi semuanya tidak terlalu bagus. Saya pikir masalahnya adalah Apple tidak benar-benar mendokumentasikan format meta data untuk data yang diperlukan.

Begini cara saya melakukannya untuk waktu yang lama, sangat sukses:

  1. Buat DMG baru, dapat ditulisi (!), Cukup besar untuk menampung file biner dan ekstra yang diharapkan seperti readme (jarang mungkin berfungsi).

  2. Pasang DMG dan berikan tata letak secara manual di Finder atau dengan alat apa pun yang cocok untuk Anda melakukannya (lihat tautan FileStorm di bagian bawah untuk alat yang baik). Gambar latar belakang biasanya merupakan gambar yang kami masukkan ke folder tersembunyi (".something") pada DMG. Letakkan salinan aplikasi Anda di sana (versi apa pun, bahkan yang sudah usang akan melakukannya). Salin file lain (alias, readme, dll.) Yang Anda inginkan di sana, sekali lagi, versi lama akan baik-baik saja. Pastikan ikon memiliki ukuran dan posisi yang tepat (TKI, tata letak DMG seperti yang Anda inginkan).

  3. Lepaskan DMG lagi, semua pengaturan harus disimpan sekarang.

  4. Tulis skrip buat DMG, yang berfungsi sebagai berikut:

    • Ini menyalin DMG, jadi yang asli tidak pernah disentuh lagi.
    • Itu me-mount salinan.
    • Ini menggantikan semua file dengan yang paling up-to-date (misalnya aplikasi terbaru setelah membangun). Anda cukup menggunakan mv atau ditto untuk itu di baris perintah. Catatan, ketika Anda mengganti file seperti itu, ikon akan tetap sama, posisinya akan tetap sama, semuanya kecuali konten file (atau direktori) tetap sama (setidaknya dengan ditto, yang biasanya kita gunakan untuk tugas itu) . Anda tentu saja dapat juga mengganti gambar latar belakang dengan yang lain (pastikan saja memiliki dimensi yang sama).
    • Setelah mengganti file, buat skrip unmount salinan DMG lagi.
    • Akhirnya panggil hdiutil untuk mengonversi DMG yang dapat ditulisi, menjadi DMG yang dikompresi (dan semacamnya tidak dapat ditulisi).

Metode ini mungkin kedengarannya tidak optimal, tapi percayalah, itu bekerja sangat baik dalam prakteknya. Anda dapat meletakkan DMG (template DMG) asli bahkan di bawah kontrol versi (mis. SVN), jadi jika Anda pernah secara tidak sengaja mengubah / menghancurkannya, Anda bisa kembali ke revisi di mana itu masih baik-baik saja. Anda dapat menambahkan template DMG ke proyek Xcode Anda, bersama dengan semua file lain yang menjadi bagian dari DMG (readme, file URL, gambar latar belakang), semua di bawah kontrol versi dan kemudian membuat target (mis. Target eksternal bernama "Buat DMG") dan jalankan skrip DMG di atas dan tambahkan target utama lama Anda sebagai target dependen. Anda dapat mengakses file di pohon Xcode menggunakan $ {SRCROOT} dalam skrip (selalu menjadi sumber root produk Anda) dan Anda dapat mengakses produk build dengan menggunakan $ {BUILT_PRODUCTS_DIR} (selalu direktori di mana Xcode membuat hasil build) .

Hasil: Sebenarnya Xcode dapat menghasilkan DMG di akhir build. DMG yang siap dirilis. Tidak hanya Anda dapat membuat relase DMG cukup mudah dengan cara itu, Anda benar-benar dapat melakukannya dalam proses otomatis (pada server tanpa kepala jika Anda suka), menggunakan xcodebuild dari baris perintah (misalnya bangunan otomatis malam).

Mengenai tata letak awal templat, FileStorm adalah alat yang baik untuk melakukannya. Ini komersial, tetapi sangat kuat dan mudah digunakan. Versi normal kurang dari $ 20, sehingga sangat terjangkau. Mungkin seseorang dapat mengotomatisasi FileStorm untuk membuat DMG (mis. Via AppleScript), tidak pernah mencobanya, tetapi begitu Anda telah menemukan DMG templat yang sempurna, sangat mudah untuk memperbaruinya untuk setiap rilis.

Mecki
sumber
3
Saya sudah membuang ide untuk melakukannya dengan cara ini, karena beberapa alasan. Berikut adalah dua di antaranya: isi dari penginstal akan bervariasi sesuai produk, dan kami hanya ingin bergantung pada perangkat lunak yang diinstal pada mesin paket dan skrip - rutin tunggal, minimal, manual untuk menambahkan produk baru.
Ludvig A. Norin
Ini adalah skenario yang sama seperti yang kita miliki. Kami memiliki lebih dari selusin produk; masing-masing memiliki DMG yang sama sekali berbeda. Membuat satu templat DMG per produk adalah satu-satunya tugas waktu dan membawa Anda beberapa menit. Dan apa yang Anda maksud dengan "installer"? Paket instalasi PKG / MPKG?
Mecki
Ini bukan skenario yang sama. Kami sering menambahkan produk, dengan pemberitahuan singkat. Rutin manual minimal berarti menjalankan skrip yang memberi nama produk dan beberapa atribut lainnya. Ada alasan di balik ini juga yang membuat kami membuat keputusan untuk tidak menggunakan solusi semacam itu.
Ludvig A. Norin
Kami telah memisahkan proses paket dari proses pembangunan, karena dilakukan oleh orang yang berbeda pada waktu yang berbeda. Proses paket menciptakan installer untuk Windows, Windows CE, Symbian, AIX, Linux dan Solaris juga.
Ludvig A. Norin
Anda mungkin merujuk ke hdiutil, bukan hdutil.
Ivan Vučica
25

Membawa pertanyaan ini terkini dengan memberikan jawaban ini.

appdmgadalah program baris perintah sumber terbuka sederhana, mudah digunakan yang membuat file dmg dari spesifikasi json sederhana. Lihatlah readme di situs web resmi:

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

Contoh cepat:

  1. Pasang appdmg

    npm install -g appdmg
    
  2. Tulis file json ( spec.json)

    {
      "title": "Test Title",
      "background": "background.png",
      "icon-size": 80,
      "contents": [
        { "x": 192, "y": 344, "type": "file", "path": "TestApp.app" },
        { "x": 448, "y": 344, "type": "link", "path": "/Applications" }
      ]
    }
    
  3. Jalankan program

    appdmg spec.json test.dmg
    

(Penafian. Saya pencipta appdmg)

Linus Unnebäck
sumber
3
sederhana dan efektif. Satu-satunya downside adalah itu memerlukan npm untuk diinstal
Jack James
@Creator: bisakah Anda membuatnya maju seperti ini menawarkan GUI tanpa harus drag and drop? s.sudre.free.fr/Software/Packages/about.html
Jika file .app tidak ada dalam folder yang sama dengan file json, ini tidak berfungsi, itu memberikan kesalahan "file tidak ditemukan" ketika Anda menentukan jalur relatif di "path"
Joey
@ Joey, bisakah Anda membuka masalah pada repositori Github jika tidak berhasil untuk Anda?
Linus Unnebäck
@ Joey: Tidak perlu berada di folder yang sama, saya memiliki latar belakang, aplikasi semua di jalur yang berbeda, cukup lewati jalur relatif seperti ../../../ABC
Anoop Vaidya
22

Bagi Anda yang tertarik dengan topik ini, saya harus menyebutkan bagaimana saya membuat DMG:

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

dimana

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
sumber
1
Tidak apa-apa, tetapi itu tidak memenuhi kebutuhan sebenarnya (gambar latar belakang, posisi item dalam folder, dll.)
Tom Bogle
membuat DMG tapi sekali lagi saya harus menjalankan Script (.sh) saya menggunakan CMD saya perlu secara otomatis menjalankan sh setelah membuat DMG
SANTOSH
13

Aplikasi saya, DropDMG , adalah cara mudah untuk membuat gambar disk dengan gambar latar belakang, tata letak ikon, ikon volume khusus, dan perjanjian lisensi perangkat lunak. Itu dapat dikontrol dari sistem build melalui alat baris perintah "dropdmg" atau AppleScript. Jika diinginkan, gambar dan file lisensi RTF dapat disimpan di bawah sistem kontrol versi Anda.

Michael Tsai
sumber
3
Tim saya memiliki ini bekerja dengan indah dan otomatis pada server membangun Jenkins CI, lengkap dengan latar belakang, seret ke Aplikasi alias. Jalankan, jangan berjalan, ke DropDMG untuk membuat gambar disk.
Paul Collins
Aplikasi yang bagus, saya akan membelinya setelah uji coba saya berakhir.
kilik52
Terlihat bagus, tetapi sepertinya tidak memiliki opsi untuk mengubah ukuran jendela.
avi
@avi DropDMG secara otomatis mengukur jendela ke gambar latar belakang yang Anda atur (atau sisipkan ke dalam gambar itu jika diinginkan).
Michael Tsai
Terima kasih banyak! Apakah mungkin untuk mengubah ukuran tanpa gambar latar belakang?
avi
6

Saya menemukan aplikasi mac yang hebat ini untuk mengotomatiskan proses - http://www.araelium.com/dmgcanvas/ Anda harus melihatnya jika Anda membuat penginstal dmg untuk aplikasi mac Anda

Saurabh
sumber
1
Perhatikan bahwa ini bukan program gratis, jadi tidak cocok untuk banyak lingkungan.
Jay Maynard K5ZC
5

Untuk membuat DMG yang terlihat bagus, Anda sekarang dapat menggunakan beberapa sumber terbuka yang ditulis dengan baik:

Anni S
sumber
Mungkin mereka memindahkannya. Anda dapat menggunakan create-dmg dan node-appdmg. Saya menggunakan create-dmg. Ini baik.
Anni S
@ PamelaCook-LightBeCorp Jika Anda masih tertarik. Tautan ke dmgbuild telah diperbaiki.
SubOptimal
4

Jika Anda ingin mengatur ikon volume khusus maka gunakan perintah di bawah ini

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

Sekarang buat baca / tulis dmg

/*to set custom icon attribute*/
SetFile -a C /Volumes/dmgName
Parag Bafna
sumber
Bisakah Anda jelaskan apa arti "jalan Anda" di sini? Dapatkah saya menggunakan file ikon apa pun pada disk, dan SetFile akan menyalinnya, atau apakah saya perlu menggunakan file yang ada di dalam .dmg? Saya hanya punya satu Mac, jadi sulit untuk menguji apakah barang-barang akan bekerja di komputer lain.
Milan Babuškov
"jalan Anda" adalah nama DMG. (/ Volume / dmgName)
Parag Bafna
Anda harus menyalin file icns. cp "/Volumes/customIcon.icns" "/Volumes/dmgName/.VolumeIcon.icns"
Parag Bafna
4

Saya akhirnya berhasil dalam proyek saya sendiri (yang kebetulan berada di Xcode). Menambahkan 3 skrip ini ke fase build Anda akan secara otomatis membuat Disk Image untuk produk Anda yang bagus dan rapi. Yang harus Anda lakukan adalah membangun proyek Anda dan DMG akan menunggu di folder produk Anda.

Script 1 (Buat 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 Script Properti Jendela):

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

Pengukuran di atas untuk pekerjaan jendela untuk proyek saya secara khusus karena ukuran gambar latar belakang saya dan resolusi ikon; Anda mungkin perlu mengubah nilai-nilai ini untuk proyek Anda sendiri.

Script 3 (Buat Skrip Gambar Disk Akhir):

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

Pastikan file gambar yang Anda gunakan ada di direktori $ PROJECT_DIR / $ PROJECT_NAME /!

P.M.
sumber
Itu membuat gambar disk kosong di proyek saya. Ada saran.
ManiaChamp
Bagian skrip Shell hanya berfungsi, tetapi bagaimana saya bisa menambahkan skrip Apple dengan Skrip Shell di RunScript di bawah Build Phase itu menunjukkan kesalahan, setiap pernyataan skrip apel adalah simbol tidak ditemukan.
ManiaChamp
2

File .DS_Store menyimpan pengaturan windows di Mac. Pengaturan Windows meliputi tata letak ikon, latar belakang jendela, ukuran jendela, dll. File .DS_Store diperlukan dalam menciptakan jendela untuk gambar yang dipasang untuk mempertahankan pengaturan file dan latar belakang jendela.

Setelah file .DS_Store dibuat, Anda cukup menyalinnya ke installer yang dibuat (DMG).

hor10zs
sumber
Tapi pertama-tama tambahkan gambar latar belakang ke dmg dengan menamakannya sesuatu seperti .background.png dan kemudian menggunakan Cmd-J untuk menambahkan gambar (!) Ke latar belakang.
Gijs
2

Saya juga perlu menggunakan pendekatan baris perintah untuk melakukan pengemasan dan pembuatan dmg "secara terprogram dalam skrip". Jawaban terbaik yang saya temukan sejauh ini adalah dari kerangka kerja Rilis proyek Adium (Lihat R1). Ada skrip khusus (AdiumApplescriptRunner) untuk memungkinkan Anda menghindari interaksi GUI OSX WindowsServer. Pendekatan "osascript applescript.scpt" mengharuskan Anda masuk sebagai pembuat dan menjalankan pembuatan dmg dari sesi baris perintah vt100.

Sistem manajemen paket OSX tidak begitu canggih dibandingkan dengan Unixen lain yang dapat melakukan tugas ini dengan mudah dan sistematis.

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

TJ Yang
sumber
2

Saya baru saja menulis utilitas baris perintah (ramah) baru untuk melakukan ini. Itu tidak bergantung pada Finder / AppleScript, atau pada salah satu dari API Alias ​​Manager (yang sudah usang), dan mudah untuk mengonfigurasi dan menggunakan.

Bagaimanapun, siapa pun yang tertarik dapat menemukannya di PyPi ; dokumentasi tersedia di Read The Docs .

Alastair
sumber
1

Jawaban ini terlalu rumit dan waktu telah berubah. Berikut ini berfungsi pada 10,9 saja, izin sudah benar dan itu terlihat bagus.

Buat DMG hanya-baca dari direktori

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

Buat DMG hanya-baca dengan ikon (tipe .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

Jika hal lain perlu terjadi, hal termudah ini adalah membuat salinan sementara dari SRC_DIR dan menerapkan perubahan sebelum membuat DMG.

user246672
sumber
Jawaban ini tidak menambahkan apa pun ke apa yang telah ditulis sebelumnya, dan juga tidak menjawab pertanyaan awal (ini bukan tentang hanya menempatkan ikon di dmg, atau bagaimana menandatanganinya; pertanyaannya adalah tentang menambahkan grafik dan ikon diposisikan secara terprogram untuk a dmg).
Ludvig A. Norin